题目描述
给你一个数组 nums 和一个值 val,你需要 原地
移除所有数值等于 val 的元素,并
返回移除后数组的新长度`。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组
。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路
- 暴力解法 for循环找到等于val的元素,使用splice方法删除掉该元素。
- 双指针法
实现思路: 当查找到arr[quick]!=target时,arr[slow]=arr[quick],slow++; 当查找到arr[quick]==target时,直接跳过; 最后arr=arr.splice(0,slow+1);
代码
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
//初始化两个指针:slow:表示最后返回数组的下标,quick:表示原数组下标
let slow=0,quick=0;
for(quick;quick<nums.length;quick++){
//如果不相等,则直接将nums[quick]赋值给 nums[slow]
if(val!=nums[quick]){
nums[slow]=nums[quick];
slow++;
}
}
//数组删除掉slow到数组末尾的元素
nums.splice(slow);
// 返回数组长度
return nums.length;
};
结果
总结
在使用双指针法去删除数组元素时,一定要弄清楚两个指针分别代表的是什么,只有弄清楚了它们具体表示的内容,才能理清楚代码逻辑。