題目:
Given an integer array nums, move all 0's to the end of it while maintaining the relative order of the non-zero elements.
Note that you must do this in-place without making a copy of the array.
給定一個陣列,將0移到陣列最後,其餘非0元素維持原來的順序
且不能使用新的陣列來進行操作
ex:input:[0,1,0,3,12]=>output:[1,3,12,0,0]
我用兩個指標一個代表0的位置,一個代表非0元素的位置來實作
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
i=0
j=0
while i<len(nums) and nums[i]:
i=i+1
while j<len(nums):
if nums[j]!=0 and i<j:
temp=nums[i]
nums[i]=nums[j]
nums[j]=temp
while nums[i] and i<len(nums):
i=i+1
else:
j=j+1
兩個指標,i專門走0,j專門走非0
如果j位置>i位置且j的位置非0,兩者的元素互換
i跑到下一個0,其餘狀況就是j繼續往前走
j遍歷完後我們要的陣列也形成了
最後執行時間187ms(faster than 83.39%)
但在看討論區時我才發現,"將0移到陣列後"不就等於"將非0元素移到陣列前"嗎
我居然沒有想到,所以操作其實可以不像上面那樣繁雜
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
pos=0
for i in range(len(nums)):
if nums[i]!=0:
temp=nums[i]
nums[i]=nums[pos]
nums[pos]=temp
pos=pos+1
一個指標pos表下次存放位置,一個指標i開始搜尋非0元素
i開始遍歷,一遇到非0元素就和pos的元素互換
pos前往下一個位置
i遍歷完後就達成把所有非0元素順序不變的往前移了
最後執行時間161ms(faster than 98.76%)
那我們下題見