移除数组元素

33 阅读1分钟

题目描述

给你一个数组 nums 和一个值 val,你需要 原地移除所有数值等于 val 的元素,并返回移除后数组的新长度`。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

image.png

思路

  1. 暴力解法 for循环找到等于val的元素,使用splice方法删除掉该元素。
  2. 双指针法

image.png

实现思路: 当查找到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;
};

结果

image.png

总结

在使用双指针法去删除数组元素时,一定要弄清楚两个指针分别代表的是什么,只有弄清楚了它们具体表示的内容,才能理清楚代码逻辑。