我正在借助数组实现整数的自定义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++;
}
}
基本上,您保留两个索引:
i
和j
。索引
i
跟随“原始”数组,而索引j
跟随“新”数组(删除后)。索引
i
遍历所有元素:如果a[i]
不等于value
,则将其复制到新位置j
并同时递增j
和i
。如果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}