08 移動零-20200320
題目
給定一個數組 nums
,編寫一個函數將所有 0
移動到數組的末尾,同時保持非零元素的相對順序。
示例
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
說明
- 必須在原數組上操作,不能拷貝額外的數組。
- 儘量減少操作次數。
注意事項:
- 不能額外開闢新空間。
- 注意空數組。
思路一
直接一次遍歷,找到0進行pop()操作,再將0進行insert()插到最後。
修改經歷:
1. 沒有考慮到兩個零相鄰的情況,這樣的話,循環會一直卡在這裏。(第一次提交)
- 解答錯誤
2. 換了個思路,將pop和insert分開做,先彈出再再最後insert0。但是這個內存很是很大,每次都是14MB左右。(第二次提交)
- 執行用時 :36 ms, 在所有 Python3 提交中擊敗了95.86%的用戶
- 內存消耗 :14 MB, 在所有 Python3 提交中擊敗了5.02%的用戶
心得體會:
要注意while和for的區別,for裏的索引會一直增加,如果想要自己控制指針的話,還是用while好。
最終代碼展示:
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
if len(nums) != 0:
length, i = len(nums), 0
while i < len(nums):
if nums[i] == 0:
nums.pop(i)
else:
i += 1
nums.append(0)
else:
pass
for _ in range(0, length-len(nums)):
nums.append(0)
return nums
思路二
採用雙指針,一個向前遇到0彈出,指針不變,遇到非零加一。一個向後,當彈出0時插入,並減一。最後兩個相等結束。
修改經歷:
1. 一次就成了。(第一次提交)
- 執行用時 :36 ms, 在所有 Python3 提交中擊敗了95.86%的用戶
- 內存消耗 :14.1 MB, 在所有 Python3 提交中擊敗了5.02%的用戶
心得體會:
當問題分析清楚了,還是很容易就解決了。
最終代碼展示:
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
if len(nums) != 0:
i, j = 0, len(nums)
while i < j:
if nums[i] == 0:
nums.insert(j, 0)
nums.pop(i)
j -= 1
else:
i += 1
else:
pass
return nums
思路三
這個思路是從題解大神那學來的,就是交換項。兩個指針 i 和 j,i 只管向前走,遇到非零元素就和 j 交互,遇到0就pass。j 遇到非零元素元素,交換後加一。這樣,j 就會小於等於 i。開始時 i 和 j 一起走,當 i 遇到 0時跳過,此時 j 就留在了0上。所以交換時就會把0換到後面。
修改經歷:
1. 大神就是大神,服了。(第一次提交)
- 執行用時 :28 ms, 在所有 Python3 提交中擊敗了99.59%的用戶
- 內存消耗 :14.1 MB, 在所有 Python3 提交中擊敗了5.02%的用戶
心得體會:
這個換位的想法很妙啊,真的很妙,強烈推薦的!!有大神說這是 Cyclic Sort(循環排序)
最終代碼展示:
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
if len(nums) != 0:
j = 0
for i in range(0, len(nums)):
if nums[i] != 0:
nums[i], nums[j] = nums[j], nums[i]
j += 1
return nums