📜  门|门 IT 2008 |第 44 题(1)

📅  最后修改于: 2023-12-03 14:58:36.431000             🧑  作者: Mango

门|门 IT 2008 |第 44 题

这是一道经典的编程题目,也是编程基础知识的考察题目之一。

题目描述

给定一个数组 nums 和一个值 val,需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的空间,你必须在原地修改输入数组并使用 O(1) 额外空间的条件下完成。

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

输入

输入数组 nums 和一个值 val。其中,nums 是长度为 n 的数组,0 ≤ n ≤ 10^4,值的范围是 -10^4 ≤ nums[i] ≤ 10^4;val 的取值范围是 -10^5 ≤ val ≤ 10^5。

输出

返回移除完所有等于 val 的元素后的新长度。

示例
输入:
nums = [3, 2, 2, 3]
val = 3

输出:
2

解释:
函数应该返回新的长度 2,nums 数组中前两个元素为 2。
解题思路

该问题可以使用双指针来解决。左指针指向当前处理过的不包括 val 的数组的最后一个元素,右指针用于扫描数组。

具体步骤如下:

  • 定义一个指针 index,用于表示当前处理过的不包括 val 的数组的最后一个元素的下标,初始值设为 0。
  • 从左到右扫描数组,如果当前元素不等于 val,则将其覆盖到 index 所指向的位置,并将 index 加 1。
  • 重复 2,直到扫描完整个数组。
代码示例
def removeElement(nums, val):
    index = 0
    for i in range(len(nums)):
        if nums[i] != val:
            nums[index] = nums[i]
            index += 1
    return index
时间复杂度分析

该算法需要对数组进行一次遍历,因此时间复杂度为 O(n),其中 n 是数组的长度。

空间复杂度分析

该算法只需要使用两个变量(即 index 和 i)作为指针,因此空间复杂度为 O(1)。