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; } }