我正在借助数组实现整数的自定义ArrayList类,并且我希望能够从数组中删除某个值。我的问题是,当彼此相邻有许多相同的可删除值时,彼此相邻的两个0导致出现错误。我试图解决它几个小时没有运气。这是我的代码:

    int max=10;
    public int[] a = new int[max];

    @Override
    public void deleteValues(int value) {
    int tempIndex=0;

    for (int i = 0; i <50 ; i++) {
        if (a[tempIndex] == value) {
            a[tempIndex] = a[tempIndex + 1];
            a[tempIndex + 1] = 0;
        } else if (a[tempIndex] == 0) {
            a[tempIndex] = a[tempIndex + 1];
            a[tempIndex + 1] = 0;

        } else {
            tempIndex++;

        }

    }


}


我的数组看起来像删除值(4)之前的样子:

[4, 2, 3, 4, 4, 4, 4, 1, 2, 3]


运行代码后,这是错误的结果:

[2, 3, 0, 0, 4, 4, 4, 1, 2, 3]


我想实现的目标:[2, 3, 1, 2, 3, 0, 0, 0, 0, 0]

我的问题是:使用尽可能少的循环,使代码正常工作的最佳方法是什么?

最佳答案

代码中的问题之一是,您总是将索引tempIndex+1处的元素复制到tempIndex:它始终是下一个元素。
实际上,从数组中删除5元素后,您必须将tempIndex+5复制到tempIndex中。

我认为这是一个很好的方法:

public void deleteValues(int[] a, int value) {
    int j=0;
    for(int i=0; i<a.length; i++) {
        if(a[i]!=value) {
            a[j] = a[i];
            j++;
        }
    }
    // fill the rest of the array with zeros
    while(j<a.length) {
        a[j] = 0;
        j++;
    }
}


基本上,您保留两个索引:ij
索引i跟随“原始”数组,而索引j跟随“新”数组(删除后)。
索引i遍历所有元素:如果a[i]不等于value,则将其复制到新位置j并同时递增ji。如果a[i]等于value,请跳过它并增加i而不增加j
复制或跳过所有元素后,用零填充数组的末尾。

输入样例:

a     = {4, 2, 3, 4, 4, 4, 4, 1, 2, 3}
value = 4


输出:

a     = {2, 3, 1, 2, 3, 0, 0, 0, 0, 0}

10-04 20:20