1、题目
给你一个数组 nums?和一个值 val,你需要 原地 移除所有数值等于?val?的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
2、解答
- 直接遍历法:类似283道题目逻辑一样,把不等于val的元素移动到数组左边即可。
- 双指针法:这个就是左右两边同时遍历数组,移动然后把右边不等于val的值移动到左边,左边等于val的元素移动到右边。
def removeElement(self, nums, val):
"""
直接遍历
:type nums: List[int]
:type val: int
:rtype: int
"""
val_index = 0
for index, i in enumerate(nums):
if i != val:
nums[val_index] = i
val_index += 1
nums = nums[:val_index]
return val_index
def removeElement2(self, nums, val):
"""
双指针法:
:type nums: List[int]
:type val: int
:rtype: int
"""
left = 0
right = len(nums)-1
while left<right:
while nums[right]==val and left<right:
right-=1
while nums[left]!=val and left<right:
left+=1
nums[left],nums[right]=nums[right], nums[left]
if nums[left]!=val:
left +=1
nums = nums[:left]
print(nums)
return left
|