错误示范
# 1. 移动零
nums = [0, 1, 0, 3, 12]
# left = 0
# right = len(nums) + 1for i in range(len(nums) + 1):nums_index = nums[i]if nums_index == 0:nums.pop(i)print(nums)
-
修改列表时遍历:在遍历列表的同时修改列表(如删除元素)会导致问题。这是因为一旦你从列表中删除一个元素,后面的元素会向前移动,这样就会跳过一个元素,并且可能导致索引越界错误。这正是你遇到的
IndexError
的原因。 -
范围错误:你的循环范围设定为
range(len(nums) + 1)
,这意味着你在尝试访问nums
列表之外的一个元素,因为索引是从0开始的。 -
错误的方法:直接从列表中删除0元素并不符合题目要求将所有0移动到数组末尾的目标。即使想这样做,你也需要在删除0之后再在列表末尾添加相同数量的0。
改进的方法:
可以使用一种更直接的方法,即使用一个“慢”指针(slow
)来追踪非零元素应该插入的位置。这里是一个改进后的解决方案:
nums = [0, 1, 0, 3, 12]
slow = 0 # 指向下一个非零元素应该插入的位置for fast in range(len(nums)):if nums[fast] != 0:# 当前元素非零,将其移动到slow指向的位置,然后增加slownums[slow], nums[fast] = nums[fast], nums[slow]slow += 1print(nums)