0721更新
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
length = len(nums)
if length <= 1:
return nums
zero = 0
tail = zero + 1
while zero <= tail and tail <= length - 1:
while zero <= length - 1 and nums[zero] != 0:
zero += 1
if zero == length - 1:
return nums
# 此时保证了nums[zero] = 0
tail = max(tail,zero + 1)# tail 为zero后第一个非0的
while tail <= length - 1 and nums[tail] == 0:
tail += 1
if tail == length:
return nums
nums[zero],nums[tail] = nums[tail],nums[zero]
zero += 1
tail += 1
在原数组上操作
统计0的个数(以下做法不好 因为操作次数多)
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
k = 0
length = len(nums)
i = length - 1
while i >= 0:
#tempindex = -1 - i
if nums[i] == 0:
k += 1
nums.pop(i)
i -= 1
nums += [0 for _ in range(k)]
双指针
思路
a为主指针
b为指向a之前 最前面为0的元素
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
a = 0#主游标
b = 0#指最前面的0元素
length = len(nums)
if length <= 1:
return 0
#for i in range(length):
while a < length:
if nums[a] != 0:
nums[a],nums[b] = nums[b],nums[a]
a += 1
while b < a and nums[b] != 0:
b += 1