此代码如何用于输入: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--;
}
}
}
答案 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减少,因此它不会再次引用该单元格。它删除了额外的元素,但也创建了一个新的元素,你必须放置一个计数器来获得重复次数,然后你必须切片数组或打破它以使其工作。