LeetCode # 283 陣列裡的0全都移到最後,其他保持原順序
輸入: [0, 1, 0, 3, 12]
輸出: [1, 3, 12, 0, 0]
方法一(直接求非零元素的最終位置):
- 用一個變數zero_num記錄到目前為止遇到0的個數,當元素為0時就將其加一,然後跳過繼續遍歷下一個數;
- 如果當前的數字不是0,根據zero_num我們可以知道它的最終位置。比如輸入陣列中,1之前出現過一個0,把這個0去除,等同於1要往前移一位;又如12之前出現過兩個0,把這兩個0去除,等同於12最終要往前移兩位。所以每個非零數字當前下標減去zero_num就是它最終位置的下標,代表它應該往前跳zero_num步;
- 陣列全部遍歷完後,還剩最後一步:將統計的zero_num個0放到最後。
####### 原始版
l = len(nums)
zero_num = 0 # 記錄到目前為止遇到幾個0了
for i, num in enumerate(nums):
if num == 0:
zero_num += 1
continue
nums[i-zero_num] = num
# 最後補0
for j in range(l-zero_num, l):
nums[j] = 0
####### 簡化版
nums.sort(key=lambda x: x == 0) # True在False之前
方法二(雙指標分別記錄已排序和未排序的位置):
- 左指標指向已排好序的最後一個數字(最終位置已經確定了,並且其左側的都是非零數),右指標指向還沒排序的第一個數字;
- 如果右指標指的數字為0,則繼續往後遍歷;如果不為0,那就要讓左指標向後一位,並將此時的左右交換,然後右指標繼續往後;
- 這種方法利用了左指標和右指標定義對應的性質:
左指標左邊的數都是已經排好的非零數,每次右指標找到新的非零數時,左指標會往後一位,如果此時左和右之間有間隔,那間隔的這些數字一定都是0,比如left =0, right = 3時,陣列變成了[1, 0 ,0, 3, 12],我們發現右指標所指的3不為0,就會讓左指標向後一位,指向1後面的0,然後讓0和3互換,這樣就會把0不斷往後換,但是顯然這中間有許多冗餘操作,每次都要移動不同的0.
l = len(nums)
left, right = -1, 0
while right<l:
if nums[right]!=0:
left += 1
temp = nums[left]
nums[left] = nums[right]
nums[right] = temp
right += 1
相關文章
- LeetCode - 1389 - 按既定順序建立目標陣列LeetCode陣列
- 進行List集合去重操作,分為保持原List集合元素順序和不保持原順序
- JavaScript 陣列順序打亂JavaScript陣列
- leetcode陣列練習題2:283. 移動零LeetCode陣列
- 順序跳躍顯示陣列中的值陣列
- Leetcode 陣列中和為給定值的最長子陣列LeetCode陣列
- leetcode最短無序連續子陣列LeetCode陣列
- 調整陣列元素順序演算法陣列演算法
- LeetCode3264[K次乘運算後的最終陣列I]LeetCode陣列
- 如何保持json序列化的順序性?JSON
- LeetCode 283 jsLeetCodeJS
- 按照陣列順序給物件重新組合成新物件陣列物件
- laravel 按照whereIn中給定陣列順序輸出Laravel陣列
- LeetCode—283—Move ZeroesLeetCode
- LeetCode題解(Offer21):調整陣列順序使奇數位於偶數前面(Python)LeetCode陣列Python
- 佇列-順序儲存佇列
- 陣列--移除陣列中指定的元素,不改變原陣列和改變原陣列陣列
- 給定一個按非遞減順序排序的整數陣列 A,返回每個數字的平方組成的新陣列,要求也按非遞減順序排序。排序陣列
- 佇列順序性引發的思考佇列
- PHP獲取陣列最後一個值PHP陣列
- JavaScript獲取陣列最後一個元素JavaScript陣列
- leetcode_283. 移動零LeetCode
- ACM金牌選手整理的【LeetCode刷題順序】ACMLeetCode
- leetcode 845. 陣列中的最長山脈 做題筆記LeetCode陣列筆記
- 佇列的順序儲存--迴圈佇列的建立佇列
- Java 定義長度為 0 的陣列 / 空陣列Java陣列
- LeetCode刷題—陣列LeetCode陣列
- 【LeetCode Hot 100】4. 尋找兩個正序陣列的中位數LeetCode陣列
- GO實現:leetcode之尋找兩個正序陣列的中位數GoLeetCode陣列
- 順序迴圈佇列的介面設計佇列
- 記一個TS 列舉順序的坑
- LeetCode1005. K 次取反後最大化的陣列和LeetCode陣列
- 重寫陣列的方法(改變原陣列)陣列
- 封裝優先順序佇列封裝佇列
- WSL遷移到其他磁碟
- 【劍指Offer】調整陣列順序使奇數位於偶數前面陣列
- JZ-013-調整陣列順序使奇數位於偶數前面陣列
- 面試題21:調整陣列順序奇數位於偶數前面面試題陣列