给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
#
# @lc app=leetcode.cn id=283 lang=python3
#
# [283] 移动零
#
# @lc code=start
class Solution:
def moveZeroes(self, nums) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
cnt = 0
i = 0
while i < len(nums):
if nums[i] == 0:
del nums[i]
cnt += 1 #第一次执行时i=0,由于第一个元素为0,下面的else未执行,所以当第二次执行时i依然为0
else:
i += 1
nums.extend([0]*cnt)
if __name__ == "__main__":
so = Solution()
nums = [0,0,1]
res = so.moveZeroes(nums)
print(res)
# @lc code=end
如果使用的for循环:
#
# @lc app=leetcode.cn id=283 lang=python3
#
# [283] 移动零
#
# @lc code=start
class Solution:
def moveZeroes(self, nums) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
cnt = 0
for i in range(len(nums)): #i每一次循环自动+1,当列表长度变短时,必然出现list index out of range
if nums[i] == 0:
#IndexError: list index out of range
del nums[i]
cnt += 1
nums.extend([0]*cnt)
if __name__ == "__main__":
so = Solution()
nums = [0,0,1] #另外,第一个0被删除后,列表的第一个元素依然是0,如果使用for自增1的话,会遗漏掉部分元素的判断
res = so.moveZeroes(nums)
print(res)
# @lc code=end
总结:
1、无条件自增使用for,需要判断条件后再决定是否增加使用while
2、对可变数据类型的迭代对象,当迭代对象长度发生变化时,慎用for循环