↓快轉到主要內容
  1. LeetCode/

LeetCode 1089: Duplicate Zeros

·1 分鐘· ·
LeetCode Easy Array Two-Pointers
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-10-18

  • 提交紀錄:Runtime Error → Wrong Answer → Accepted

解題思路
#

每個數最後的位置是「原位置 + 它前面(含自己之前)有幾個 0」。從後往前搬才不會覆蓋還沒搬的數(Two Pointers 模板二):

  • zeros 一開始是 0 的總數。
  • 從尾巴往前,nums[i] 寫到 i + zeros(超出範圍就丟掉)。
  • nums[i] 是 0 時,先把複製的那個 0 寫到 i + zeros,zeros -= 1,再把原本的 0 寫到 i + zeros。

我的嘗試
#

第一版從前往後處理,index 超出範圍;第二版從後往前搬了,但遇到 0 時只寫了一次(複製的那個沒寫),例如 [0, 0, 3]:答案 [0, 0, 0],回傳 [0, 0, 3]。

正確解法
#

class Solution:
    def duplicateZeros(self, arr: List[int]) -> None:
        n, zeros = len(arr), arr.count(0)
        for i in range(n - 1, -1, -1):
            if arr[i] == 0:
                if i + zeros < n:
                    arr[i + zeros] = 0                   # 複製出來的 0
                zeros -= 1
            if i + zeros < n:
                arr[i + zeros] = arr[i]

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 從前往後搬會覆蓋還沒處理的數。
  • 遇到 0 要寫兩次,而且兩次的位置差一格。

面試口說整理
#

每個數要往後移的格數等於它前面有幾個 0,所以我先數 0 的總數,再從後往前搬,遇到 0 時多寫一個 0 並把位移減一。時間 O(n)、空間 O(1)。

相關文章

LeetCode 977: Squares of a Sorted Array
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 977 解題筆記:平方後最大的一定在兩端,左右指針比較兩端的平方,大的從結果的最後面往前填
LeetCode 905: Sort Array By Parity
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 905 解題筆記:寫入指標把偶數交換到前面,跟 move zeroes 一樣
LeetCode 922: Sort Array By Parity II
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 922 解題筆記:偶數位置的指標 i、奇數位置的指標 j,各自跳兩格;i 放錯(奇數)時讓 j 找到放錯的偶數再交換
LeetCode 821: Shortest Distance to a Character
·1 分鐘
LeetCode Easy Array Two-Pointers String
LeetCode 821 解題筆記:左往右掃一次記錄到左邊最近的 c 的距離,右往左再掃一次取較小值
LeetCode 832: Flipping an Image
·1 分鐘
LeetCode Easy Array Two-Pointers Bit-Manipulation Matrix
LeetCode 832 解題筆記:每一列先左右反轉再把 0、1 互換;可以用左右指針同時做
LeetCode 455: Assign Cookies
·1 分鐘
LeetCode Easy Array Two-Pointers Greedy Sorting
LeetCode 455 解題筆記:小孩和餅乾都排序,用最小的、夠大的餅乾滿足最小的小孩;兩個指標各走一次