图片说明

class Solution {
    public int removeElement(int[] nums, int val) {
        int len = nums.length;
        if (len == 0) return 0;
        int i = 0;
        int res = 0;
//跟26题一样 差不多的思路 也就是想想怎么移动双指针的位置 一共有三种移动方式 
        while (i < len) {
//第一种移动方式 就是需要移除 所以我们需要定位到不需要移除的位置 然后赋值
            if (nums[i] == val) {
                while(i<len && nums[i]==val){
                    i++;
                }
                if(i<len){
                    nums[res] = nums[i];
                    res++;
                }
            }
//第二种定位方式是不同步问题 也就是两个指针一前一后 说明两个指针之间存在空位 
           else if (nums[i] != val&&i!=res){
                nums[res] = nums[i];
                res++;
            }
//第三种定位是 指针同步 所以一起前进
            else if (nums[i] != val&&i==res){
                res++;
            }
            i++;
        }
        return res;
    }
}

第二种解法 也是上面方式的代码优化

class Solution {
    public int removeElement(int[] nums, int val) {
        int i = 0;
        for (int j = 0; j < nums.length; j++) {
            if (nums[j] != val) {
                nums[i] = nums[j];
                i++;
            }
        }
        return i;
    }
}

官方的解法也很微妙

class Solution {
    public int removeElement(int[] nums, int val) {
        int i = 0;
        int n = nums.length;
        while (i < n) {
            if (nums[i] == val) {
                nums[i] = nums[n - 1];
                n--;
            } else {
                i++;
            }
        }
        return n;
    }
}