问题: 给定长度为N的元素数组,范围从0到N-1,您的任务是编写一个重新排列数组元素的程序。数组中可能不存在所有元素,如果元素不存在,则数组中将存在-1。重新排列数组,使A [i] = i,如果不存在i,则在该位置显示-1。
我的代码:
#include <iostream>
using namespace std;
int main()
{
long int n;
cin>>n;
long int a[n];
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for (int i=1;i<=n;i++)
{
while(a[i]==i&&a[i]==-1)
{
int temp=a[i];
a[i]=a[temp];
a[temp]=temp;
}
}
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return 1;
}
输出:
6
-1 4 2 3 -1 5
-1 4 2 3 -1 5
任何人都可以帮助我找出所应用逻辑中的错误吗? 预先感谢。
答案 0 :(得分:1)
for(int i=1;i<=n;i++)
错误,元素从0到N-1,而不是1到N
while(a[i]==i&&a[i]==-1)
这永远不会发生,您要求a [i]等于i和-1,这意味着要让i等于-1,这不会在循环中发生。
对于一个简单的答案,您需要对列表进行排序,然后对其进行处理。为了获得有效的答案,您需要创建一个大小为N的布尔数组,然后迭代该数组并检查存在哪些值。然后,您可以对布尔数组进行迭代以在数字存在时写入数字,在数字不存在时写入-1。
答案 1 :(得分:0)
解决此类问题的最简单方法是获得一副扑克牌并将其放在桌上,然后手动解决该问题。写下您执行的每个步骤,然后编写执行这些步骤的代码。
因为卡从1开始而不是0,所以我将10用作0。使用小丑来表示空白(问题描述中为-1)。
拿五张卡,并将它们放在六个空格中
2 10 4 J 3 1
从位置0开始。将2拔出并用-1替换,因此您的卡片如下所示:
J 10 4 J 3 1
您将2握在手中。
然后,转到位置2,拉出4,然后将2放到那里。现在你有
J 10 2 J 3 1
您手中握有4。转到位置4(位置3)。将3替换为4,您将:
J 10 2 J 4 1
手中有3个。位置3包含小丑。因此,您将3放到该位置,然后将小丑放到一边。您现在拥有:
J 10 2 3 4 1
因此,您移至下一个位置:1.拿起10并在该位置放置一个小丑。 10号到达位置0,因此将小丑从0号位置移到10号位置,您就可以:
10 J 2 3 4 1
您现在手中什么都没有,所以您继续前进,检查位置2、3和4,这些位置已经有a [i] == i。但是位置5包含一个1。因此,将其捡起来,在该位置放置一个小丑,然后将位置1的小丑替换为刚从位置5拉出的值1。现在,数组如下所示:
10 1 2 3 4 J
您完成了。
用不同的卡片排列几次,写下您执行的步骤。经过几次练习,您应该能够写下解决问题的通用算法。然后编写一个程序来实现该解决方案。
这种问题的想法是帮助您开发这些解决问题的步骤。随着时间的流逝,您将能够直接处理较简单的问题的代码,但是您会发现建立物理模型对于处理更复杂的问题非常有用。如果您离开计算机,就不会在解决问题之前就开始尝试编程。您会发现做事方式可以节省很多挫败感。