leetcode每天一题:【移除元素】(简单)

90 阅读2分钟

这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

提供一个整数数组,和一个value,然后需要把这个数组的和value相等的元素移除掉,并返回移除后的数组后的长度。

通过例子来看看

数组: [1,2,2,1], value:2
返回: 2 ([1,1])

数组: [1,1,2,2,1,3,4,5], value:1
返回: 4 ([2,3,4,5])

数组: [1,1,2,2,1,3,4,5], value:4
返回: 7 ([1,1,2,2,1,3,5])

补充: 不准使用额外的数组空间,可以使用额外的常数空间,需要直接在原数组上面移除。

思路分析

第一种方法

因为需要在原数组上直接移除,所以需要对数组遍历的时候,发现如果当前遍历的元素和传入的value相等,则把当前的元素删除(调用splice方法)。

继续遍历。 这时候需要注意,因为删除了一个元素,需要把索引减一,往前移一位。

最终遍历结束后,返回的数组就是移除和value相等后的。返回数组的长度即可。

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function (nums, val) {
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] === val) {
      nums.splice(i, 1)
      i = i - 1
    }

  }
  return nums.length
};

image.png

第二种方法

下面再来看看第二种方法,这个和昨天的leetcode每天一题:【删除有序数组中的重复项】(简单)的第二种方法类似,也是使用双索引实现的。一个快索引,一个慢索引。

需要使用2个额外常量空间,一个指向快索引(默认值0),一个指向慢索引(默认值0)。

对数组使用while循环,每次循环快索引都要加一。直接等于数组的长度。

在循环里面需要判断,是否当前的元素和value相等。

如果不相等,则把当前的元素复制给慢索引的元素,然后慢索引加一。

如果相等,则不处理。

最后退出循环的时候,慢索引指向的位置就是移除和value相等的元素后其它的元素的长度。

返回该索引就是移除后数组的长度。

代码如下:

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function (nums, val) {
  let fast = 0, slow = 0;
  while (fast < nums.length) {
    if (nums[fast] !== val) {
      nums[slow] = nums[fast]
      slow++
    }
    fast++
  }
  return slow
};

image.png