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;
}
}
京公网安备 11010502036488号