题目如下:
283. 移动零https://leetcode.cn/problems/move-zeroes/
思路:
其实最直观的想法,不要跟着题目走,而是挑选出非0部分,按顺序排好数组。然后统计非0部分,补在后面。
官方解题提供了一种【交换】的思路,双指针,加快运行效率。我们不需要管0,只需要管非0
#解1:循环+切片
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
new=[]
for num in nums:
if num!=0:
new.append(num)
#print(new)
nums[:]=new+(len(nums)-len(new))*[0]
#解法2 双指针补0
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
i,j=0,0
while j<len(nums):
if nums[j]!=0:
nums[i]=nums[j]
i+=1
j+=1
#print(i,j,nums)
nums[:]=nums[:i]+(len(nums)-i)*[0]
上述两种速度都很快。第二种方法空间占用更低一些。
官方的【交换】:
#解法3
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
i,j=0,0
while j<len(nums):
if nums[j]!=0:
nums[i],nums[j]=nums[j],nums[i]
i+=1
j+=1
速度会慢一些