LeetCode #27 Easy

移除元素

更新于:2026-02-09 在 LeetCode 上查看

题目描述

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

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

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

示例

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2,_,_]
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3,_,_,_]

我的解题过程

解题思路:双指针法

这道题和第 26 题很像,都是要原地修改数组。区别在于这里是要移除特定值,而不是去重。

同样用双指针来解决:

  • left 指针遍历整个数组,用来读取元素
  • right 指针指向当前有效元素应该放置的位置,用来写入元素
  • nums[left] !== val 时,说明这个元素需要保留,把它写入 right 位置,然后 right++
  • nums[left] === val 时,跳过这个元素,left 继续往后走

这样遍历完后,前 right 个元素就是移除目标值后的结果。

function removeElement(nums: number[], val: number): number {
  let left = 0,
    right = 0;

  while (left < nums.length) {
    if (nums[left] !== val) {
      nums[right] = nums[left];
      right++;
    }
    left++;
  }

  return right;
}

小结

这道题和第 26 题本质上是同一类问题——用双指针实现数组的原地修改:

  • 一个指针负责遍历(读)
  • 一个指针负责记录有效位置(写)
  • 只在满足条件时才执行写入操作

掌握了这个模式,很多类似的数组原地操作题目都能用这个思路解决。时间复杂度 O(n),空间复杂度 O(1)。