一下子没想出来,模拟下了计算机的步骤。如下:
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
i = 0 # i表示遍历到j处时,包含的非0数的数量
j = 0 # 遍历
nlen = len(nums)
for j in range(nlen):
if nums[j] != 0:
# 如果当前数不是0,就将它移到i的位置上;其实就是将所有非零的数挪到前面,遍历完后,后面全置为0即可。
nums[i] = nums[j]
i += 1
for j in range(i, nlen):
nums[j] = 0
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
j = 0
# 借鉴快排的思路:将大于0的数换到左边,小于的换到右边;在这就是非零的在左边,零在右边。
# 只不过不是一直换到第一个位置上,而是用j记录下一个填入非零数的位置。以此保证顺序不乱。
# 也不是从右边开始,然后换移动指针。而是一直移动i指针,j计数。
# 这个就不用再来个遍历将后边置零了。
for i in range(len(nums)):
if nums[i] :# 如果数非零,就交换位置
nums[i], nums[j] = nums[j], nums[i]
j += 1
参考链接:动画演示 283.移动零动画演示更清晰。