敘述
這是 Algorithm I
的第三天第一個題目,總共有兩題。
- 難度:
Easy
- 花費時間: 30min
- 題目
傳入一個包含數字的陣列(nums),把所有的 0 排到最後,同時保持原排序。
必須 in-place 修改 nums
點我開啟限制與範例
限制:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
Example 1:
1 | Input: nums = [0,1,0,3,12] |
Example 2:
1 | Input: nums = [0] |
筆記
第一種作法: JS 內建函式
思路如下
- 定義 numsLength 儲存原陣列大小。
- 把 nums 裡的 0 去掉。
- 跑迴圈把 0 塞回到 nums 的最後,直到 nums.length == numsLength
使用到了 JS 內建函式:
- Array.prototype.filter(): 過濾掉陣列裡的 0
- Spread syntax (…): 展開運算子,可以把陣列展開。
- Array.prototype.splice(): 在此處的用法是把刪除 0 之後的陣列塞回原陣列,來達到 in-place。
1 | /** |
第二種作法: Two Pointers
要注意,這題可以這樣寫是因為題目沒有要求 0 的順序,因為用這種寫法實際上最後結果的 0 不是按照原本的排序的。
遍歷一次陣列,把所有不是零的值跟延遲指標交換,這樣就完成了。
- Pointer 1: 主指標(mainPointer): 遍歷整個陣列。
- Pointer 2: 延遲指標(delayPointer): 指向最後一個非零元素該去的位置,每當一個非零元素跟他原本的指向的元素交換,就後推一位。
1 | /** |
成績
JS 內建函式: 因為沒有使用 Two Pointers ,所以可以明顯的看出空間複雜度非常的糟糕。
Two Pointers: