Skip to content

力扣链接:27.移除元素

难度:⭐

✏️ 方法一:

解题关键词:数组双指针

解题思路:使用两个指针,一直往后移动,如果后面指针不等于 target,那么将后面指针赋值到前一个指针指向的地方,并往后移动。

WARNING

这种方法有一个缺点就是:如果数组是 [1, 2, 3, 4, 5],然后要移除的元素是 1 时,这时 1 后面的元素都要往前移动。这时可以使用方法二

typescript
function removeElement(nums: number[], val: number): number {
  let length = nums.length;

  let left = 0;

  for (let i = 0; i < length; i++) {
    // 如果不等于要移除的元素,那么赋值到 left 指针的地方,同时 left 指针往后移动
    if (nums[i] !== val) {
      nums[left++] = nums[i];
    }
  }

  return left;
}

✏️ 方法二:

解题关键词:数组双指针

解题思路:使用两个指针,一个在最前面,一个在最后面,如果前面的指针不等于 target,那么一直往后移动,否则将最后面的元素赋值到前面指针的地方,直到两个指针相遇。

typescript
function removeElement(nums: number[], val: number): number {
  let left = 0;
  // 这里右指针一定要指向外面,如果指向最后一个元素的话,会少处理一个元素
  let right = nums.length;

  while (left < right) {
    // 不相等,左指针右移
    if (nums[left] !== val) {
      left++;
    } else {
      // 将后面元素放到前面,同时后面指针向前移动
      nums[left] = nums[right - 1];
      right--;
    }
  }

  return left;
}