第26题
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
"此为错误解法"
i = 1
while(i<len(nums)):
if nums[i]==nums[i-1]:
nums.pop(i)
i+=1
因为Python循环内部隐藏了记录当前迭代器的状态,而pop方法删除了当前元素后,迭代器自动指到下一个元素,原先的list在内存中的位置并未改变。
比如[1,1,1,2,3,3,4],第二个1被弹出后,第三个1成为了nums[1],而此时的i将变成2,导致没法弹出第三个1.
应该用
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
i = 1
while(i<len(nums)):
if(nums[i]==nums[i-1]):
nums.pop(i)
else:
i+=1
return len(nums)
第27题
一开始的解法
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)