1.第一次实现
class Solution:
def moveZeroes(self, nums) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
num_len = len(nums)
if not num_len:
return
for i in range(num_len-1,-1,-1):
if nums[i] ==0:
j = i
while j+1 < num_len and nums[j+1] !=0:
nums[j+1], nums[j] = nums[j],nums[j+1]
j +=1
2.两次遍历法
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
j = 0
for i in range(n):
if nums[i]:
nums[j] = nums[i]
j+=1
for i in range(j,n):
nums[i] = 0
- 双指针
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
left = right = 0
while right < n:
if nums[right]:
nums[right],nums[left] = nums[left],nums[right]
left += 1
right +=1
class Solution:
def moveZeroes(self, nums) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
j = 0 # 记录非0元素的位置
for i in range(len(nums)):
if nums[i] !=0:
nums[j] = nums[i]
if i!= j:
nums[i] =0
j+=1
print(nums)
5.如果可以开辟新空间,定义一个新数组,非0往前边放,0往后边放(不满足题目要求,仅仅一个思路)
nums_new = []
for i in range(len(nums)):
if nums[i]:
nums_new.append(nums[i])
for i in range(len(nums)):
if not nums[i]:
nums_new.append(nums[i])
nums = nums_new
print(nums)
6.不推荐时间,时间复杂度高
1.遍历整个数组
2.遇到0删除
3.列表后边追加0
class Solution:
def moveZeroes(self, nums) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
for i in range(len(nums)):
if nums[i] ==0:
nums.remove(0) #O(n)
nums.append(0)