使用两个游标i和j,游标i表示当前指向的元素,游标j表示指定元素所在的下标。
- 当前元素等于指定元素,i++
- 当前元素不等于指定元素,前面已经找到了一个坑a[j],把当前元素放入坑a[j],然后j++
如:3 7 2 2 1 2 3,去除2,则
- i=0, j=0:3!=2,i++, j++
[ 3 ] 7 2 2 1 2 3
- i=1, j=1:7!=2,i++, j++
3 [ 7 ] 2 2 1 2 3
- i=2, j=2:2==2,i++
3 7 [ 2 ] 2 1 2 3
- i=3, j=2:2==2,i++
3 7 [ 2 ] 2 1 2 3
- i=4, j=2:1!=2,替换,i++,j++
3 7 1 [ 2 ] 1 2 3
- i=5, j=3:2==2,i++
3 7 1 [ 2 ] 1 2 3
- i=6, j=3:3!=2,替换,i++,j++
3 7 1 3 [ 1 ] 2 3
- 此时i==7,i >= size,停止循环。j的值刚好是数组的大小。arr[
实现
int removeElements(int* arr, int size, int val) {
int i = 0;
int j = 0;
for(; i<size; ++i) {
if(arr[i] == val) {
continue;
}
arr[j] = arr[i];
j++;
}
}