在我的应用逻辑中找不到错误

时间:2018-07-16 20:54:34

标签: c++ algorithm data-structures

问题: 给定长度为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

任何人都可以帮助我找出所应用逻辑中的错误吗? 预先感谢。

2 个答案:

答案 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

您完成了。

用不同的卡片排列几次,写下您执行的步骤。经过几次练习,您应该能够写下解决问题的通用算法。然后编写一个程序来实现该解决方案。

这种问题的想法是帮助您开发这些解决问题的步骤。随着时间的流逝,您将能够直接处理较简单的问题的代码,但是您会发现建立物理模型对于处理更复杂的问题非常有用。如果您离开计算机,就不会在解决问题之前就开始尝试编程。您会发现做事方式可以节省很多挫败感。