方法1:暴力解法,使用两次for循环
var removeElement = function (nums, val) {
for (var i = 0; i < nums.length; i++) {
if (nums[i] === val) {
for (var j = i + 1; j < nums.length; j++) {
nums[j - 1] = nums[j];
}
nums.length--;
i--;
}
}
return nums.length;
};
方法2:双指针法:一层for循环就可以了。
定义两个指针,一个快指针,一个慢指针。
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
就是满数组就相当于刷子,快指针确认当前元素和val不相等之后,就被慢元素接受,作为新数组的值。慢元素指向下一个要判断的值。快数组是冲锋队,拿下一个阵地,满指针守住,再往前进一步,等待快指针再次传来好消息,知道快指针遍历完整个数组。如果这个元素不是,快指针向前移动一格,满指针不动,直到快指针传来值,我满指针再想起进一步。
注意这里返回的是新数组的长度,满指针是索引值,满指针是5的时候,arr[5]并不是新数组的内容。arr[0],arr[1],arr[2],arr[3],arr[4]就这5个item,所以长度和index的值一样,直接返回索引值就可以了。
var removeElement = function (nums, val) {
let slow = 0;
for (let fast = 0; fast < nums.length; fast++) {
if (nums[fast] !== val) {
nums[slow] = nums[fast];
slow++;
}
}
return slow;
};