愿你坚持不懈,努力进步,进阶成自己理想的人

—— 2017.09, 写给3年后的自己

数组去除指定元素

使用两个游标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++;
    }
}