第27题
因为Python循环内部隐藏了记录当前迭代器的状态,而pop方法删除了当前元素后,迭代器自动指到下一个元素,原先的list在内存中的位置并未改变。
比如[0,1,2,2,3,0,4,2],val=2,第一个2被弹出后,第二个2成为了nums[2],而此时的i将变成3,导致没法弹出第二个2.
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
'此为错误解法'
i=0
while (i<len(nums)):
if nums[i] == val:
nums.pop(i)
i+=1
return len(nums)
因此加上else语句,一开始的解法
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
i=0
while (i<len(nums)):
if nums[i] == val:
nums.pop(i)
else:
i+=1
return len(nums)
改进: 反向迭代,可以避免list变化导致漏掉元素的情况
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
for i in range(len(nums)-1,-1,-1):
if(nums[i] == val):
nums.pop(i)
return len(nums)
或者使用非迭代手段(不推荐)
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
while val in nums:
nums.remove(val)
return len(nums)
双指针法
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
'双指针法'
i = 0
for j in range(len(nums)):
# j为快指针,i为慢指针
if nums[j] != val:
nums[i] = nums[j]
i += 1
return i
四种写法时长相差不大