最简单的方法(单指针):遍历 len(nums) 次,用 i 记录当前指针的位置。若当前元素非零,i+1;若当前元素为零,先del nums[i] 再向列表末尾添加0。
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
nums_len=len(nums)
# 单指针
i=0
# 循环 nums_len 次
for iter in range(nums_len):
# 若元素不为零,指针+1
if nums[i]!=0:
i+=1
continue
# 若元素为零,删除当前元素并向末尾添0
# 由于当前元素有删减,所以指针保持不动
else:
del nums[i]
nums.append(0)
官方题解:双指针
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
n = len(nums)
# 初始化左、右指针
left = right = 0
# 右指针一直向右移动
while right < n:
# 当右指针指向非零元素时,左指针的零与右指针的非零数交换
if nums[right] != 0:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right += 1
难点:为什么每次交换时,左指针指向的是零元素?
当第一次出现0元素之前,左右指针齐头并进。但当第一个0元素出现时,右指针和左指针同时指向该0元素,但随后右指针继续向右移动,直到下一个非零元素的交换。
实际上,右指针左边直到左指针处均为0,即左右指针的位置差距就是0元素的个数。