题目:
给一个数组nums 和 一个值 val ,需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度
题目链接:移除元素
题目限制:
不要使用额外的数组空间,仅使用O(1)额外空间并原地修改数组
元素的顺序可以改变,不需要考虑数组中超出新长度后面的元素
解题思路:
因为题目只要求移除和val相同的元素,所以不需要考虑数组是否排序问题
本题解法较多,可同样使用双指针方法记录 !=val 的元素(详见文末的第26题解答笔记链接)
也可以通过将 ==val 的元素移除出去,这里涉及python内置函数的remove()、pop()、del()方法的区别
特殊情况:数组个数为0时,返回0
实现代码:
利用两个指针实现记录不等于val值的元素,fast指针用于遍历nums的所有元素,slow负责记录每个fast!=val的元素,最后返回slow记录的全部元素
# 双指针解法
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
fast = slow = 0 # 从第1个元素开始,既nums[0]
while fast < len(nums): # 设置循环条件,fast的遍历次数等于nums数组的长度
if nums[fast] != val: # 当数组nums的第fast个元素 不等于 val 值时
nums[slow] = nums[fast] # slow指针记录nums中当前fast的元素,既记录不等于val的元素
slow += 1 # 下一个slow
fast += 1 # fast遍历下一个元素
return slow # 返回所有slow = fast 的元素,既返回所有不等于 val 值的元素
count()函数用于统计nums 中,有多少个等于 val 值的元素
再移除nums中等于 val 值的第一个元素,循环count次
# count + remove + for循环 解法
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
c = nums.count(val) # 统计 val 在nums中的次数
for i in range(c): # val 在nums 中有多少次就循环多少次
nums.remove(val) # 每循环一次,就删除一次 nums中等于 val 的值
另一种循环移除方法
# while循环 + remove 解法
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
while val in nums: # 当nums中有等于 val 的值时,循环条件成立
nums.remove(val) # 移除等于 val 的值的元素
结论:
与26题的思路相似,编写代码思路时,要考虑移除元素是否会导致索引变动(例如:nums中可能存在多个等于val且连续的元素)