错误示范:
1 class Solution: 2 def removeElement(self, nums, val: int) -> int: 3 for i, num in enumerate(nums): 4 print('i=', i, ', num=', num, ', nums=', nums) 5 if num == val: 6 nums.remove(val) 7 return len(nums) 8 9 s = Solution() 10 s.removeElement([2, 0,1,2,2,3,0,4,2], 2) 11 # i= 0 , num= 2 , nums= [2, 0, 1, 2, 2, 3, 0, 4, 2] 12 # i= 1 , num= 1 , nums= [0, 1, 2, 2, 3, 0, 4, 2] 13 # i= 2 , num= 2 , nums= [0, 1, 2, 2, 3, 0, 4, 2] 14 # i= 3 , num= 3 , nums= [0, 1, 2, 3, 0, 4, 2] 15 # i= 4 , num= 0 , nums= [0, 1, 2, 3, 0, 4, 2] 16 # i= 5 , num= 4 , nums= [0, 1, 2, 3, 0, 4, 2] 17 # i= 6 , num= 2 , nums= [0, 1, 2, 3, 0, 4, 2]
解决方式:
① 使用尾递归方式

1 class Solution: 2 def removeElement(self, nums, val: int) -> int: 3 for i, num in enumerate(nums[::-1]): 4 print('i=', i, ', num=', num, ', nums=', nums) 5 if num == val: 6 nums.remove(val) 7 return len(nums) 8 9 s = Solution() 10 s.removeElement([2, 0,1,2,2,3,0,4,2], 2) 11 # i= 0 , num= 2 , nums= [2, 0, 1, 2, 2, 3, 0, 4, 2] 12 # i= 1 , num= 4 , nums= [0, 1, 2, 2, 3, 0, 4, 2] 13 # i= 2 , num= 0 , nums= [0, 1, 2, 2, 3, 0, 4, 2] 14 # i= 3 , num= 3 , nums= [0, 1, 2, 2, 3, 0, 4, 2] 15 # i= 4 , num= 2 , nums= [0, 1, 2, 2, 3, 0, 4, 2] 16 # i= 5 , num= 2 , nums= [0, 1, 2, 3, 0, 4, 2] 17 # i= 6 , num= 1 , nums= [0, 1, 3, 0, 4, 2] 18 # i= 7 , num= 0 , nums= [0, 1, 3, 0, 4, 2] 19 # i= 8 , num= 2 , nums= [0, 1, 3, 0, 4, 2]
② 使用 while 循环的方式

1 class Solution: 2 def removeElement(self, nums, val: int) -> int: 3 i = 0 4 while i < len(nums): 5 print('i=', i, ', num=', nums[i], ', nums=', nums) 6 if nums[i] == val: 7 nums.pop(i) 8 else: 9 i += 1 10 return len(nums) 11 12 s = Solution() 13 s.removeElement([2, 0,1,2,2,3,0,4,2], 2) 14 # i= 0 , num= 2 , nums= [2, 0, 1, 2, 2, 3, 0, 4, 2] 15 # i= 0 , num= 0 , nums= [0, 1, 2, 2, 3, 0, 4, 2] 16 # i= 1 , num= 1 , nums= [0, 1, 2, 2, 3, 0, 4, 2] 17 # i= 2 , num= 2 , nums= [0, 1, 2, 2, 3, 0, 4, 2] 18 # i= 2 , num= 2 , nums= [0, 1, 2, 3, 0, 4, 2] 19 # i= 2 , num= 3 , nums= [0, 1, 3, 0, 4, 2] 20 # i= 3 , num= 0 , nums= [0, 1, 3, 0, 4, 2] 21 # i= 4 , num= 4 , nums= [0, 1, 3, 0, 4, 2] 22 # i= 5 , num= 2 , nums= [0, 1, 3, 0, 4, 2]
③ 对整个序列使用切片来创建一个临时副本

1 class Solution: 2 def removeElement(self, nums, val: int) -> int: 3 for i, num in enumerate(nums[:]): 4 print('i=', i, ', num=', num, ', nums=', nums) 5 if num == val: 6 nums.remove(val) 7 return len(nums) 8 9 s = Solution() 10 s.removeElement([2, 0,1,2,2,3,0,4,2], 2) 11 # i= 0 , num= 2 , nums= [2, 0, 1, 2, 2, 3, 0, 4, 2] 12 # i= 1 , num= 0 , nums= [0, 1, 2, 2, 3, 0, 4, 2] 13 # i= 2 , num= 1 , nums= [0, 1, 2, 2, 3, 0, 4, 2] 14 # i= 3 , num= 2 , nums= [0, 1, 2, 2, 3, 0, 4, 2] 15 # i= 4 , num= 2 , nums= [0, 1, 2, 3, 0, 4, 2] 16 # i= 5 , num= 3 , nums= [0, 1, 3, 0, 4, 2] 17 # i= 6 , num= 0 , nums= [0, 1, 3, 0, 4, 2] 18 # i= 7 , num= 4 , nums= [0, 1, 3, 0, 4, 2] 19 # i= 8 , num= 2 , nums= [0, 1, 3, 0, 4, 2]