移动阵列以替换移除的元素

时间:2015-03-11 04:04:22

标签: c++ arrays shift

我应该得到输出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;

            }       
    }
}

2 个答案:

答案 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");

Demo.