无法获得此代码的逻辑

时间:2017-08-20 05:50:50

标签: c arrays

此代码如何用于输入:20051996

程序:删除数组中的复制元素

    for(i=0;i<n;i++)
    {
      for(j=i+1;j<n;j++)
       { 
          if (a[i]==a[j])
          { 
            for(k=j;k<n;k++)
             {
               a[k]=a[k+1];
             }
            n--;
            j--;
          }
       }
    }

2 个答案:

答案 0 :(得分:1)

代码遍历数组,并且每个单元格遍历剩余的单元格,检查该单元格是否等于前一个单元格。当它找到相等的那个时,它继续通过剩余的单元设置,每个单元等于下一个单元,基本上将数组移到一个上。在这样做时,它递减n以表示行的新大小并递减j以使其对阵列执行新的检查。我可以看到出现的一个问题是

        for(k=j;k<n;k++)
         {
           a[k]=a[k+1];
         }

当代码检查最后一个单元格时,它会尝试从单元格后面复制数据,因为没有,所以会出现错误。 您应该为此添加一个检查,或者不检查最后一个单元格。如果您移动阵列,您不再需要关心最后一个单元格。

此外,值得注意的是,当您将数组值移到不完全改变数组大小或删除较旧单元格时。

对于那个输入[2,0,0,5,1,9,9,6]

程序会将数组更改为[2,0,5,1,9,9,6,6]并且应该在最后一个数据上崩溃。

答案 1 :(得分:0)

这里的逻辑非常简单,元素不会被删除但是它正在被交换。

for(i=0;i<n;i++)
{
  for(j=i+1;j<n;j++)
   { 
      if (a[i]==a[j])

这是为了找到等于a [i]的元素。当我们得到数字时,有另一个循环,其针对重复的数字,然后该单元格被下一个单元格值馈送/替换。由于一个值​​已更改,因此所有剩余的单元格值与下一个值交换。

for(k=j;k<n;k++)
         {
           a[k]=a[k+1];
         }
        n--;
        j--;

现在最后一个单元格仍然存在并且数字n和j减少,因此它不会再次引用该单元格。它删除了额外的元素,但也创建了一个新的元素,你必须放置一个计数器来获得重复次数,然后你必须切片数组或打破它以使其工作。