我应该得到输出8,6。但是这个代码运行时我得到8,9。我为什么要获得输出8,6以及如何修复代码以使输出变为8,9。
int inputarray[]={9,8,9,9,9,9,6};
int length = 7;
int value = 9;
void arrayShift(int arr[], int length, int value)
{
for(int i = 0; i<length; i++)
{
if(arr[i] == value)
{
for (int k = i; k<length ; k++)
{
arr[k] = arr[k+1];
}
arr[length-1] = 0;
}
}
}
答案 0 :(得分:4)
当移动数组时,您可以使用来自其他元素的相同值替换第一个元素(包含等于value
的数字)。在这种情况下,您需要再次对此元素重新启动迭代,例如:
void arrayShift(int arr[], int length, int value)
{
for(int i = 0; i<length; i++)
{
if(arr[i] == value)
{
for (int k = i; k<length-1 ; k++)
{
arr[k] = arr[k+1];
}
arr[length-1] = 0;
i--; // <-- this
}
}
}
答案 1 :(得分:1)
您的转移算法错误:您无法在删除时调整i
。此外,效率相当低:您可以在一个包含两个索引的循环中执行此操作 - r
用于读取,w
用于写入。当您看到要保留的值时,请同时调整读数和写入索引。否则,只增加读数索引。
读取索引达到计数后,写入索引将指示您剩余的项目数。您需要以某种方式将其返回给调用者,否则他将不知道实际数据的结束位置。您可以将新长度作为函数的返回值返回,或者将length
作为指针,并在适当的位置进行调整。
int arrayShift(int arr[], int length, int value) {
int r = 0, w = 0;
for (; r != length ; r++) {
if (arr[r] != value) {
arr[w++] = arr[r];
}
}
return w;
}
以下是您的称呼方式:
int inputarray[]={9,8,9,9,9,9,6};
int length = 7;
int value = 9;
int newLen = arrayShift(inputarray, length, value);
for (int i = 0 ; i != newLen ; i++) {
printf("%d ", inputarray[i]);
}
printf("\n");