許久未寫LeetCode刷題筆記了,趁著這次參加一個小考試的機會,來自己回顧檢討一下自己的寫的這道題。
看一下題目內容
題目需求
要將陣列中的數字0全部都排到陣列最後面。
解題過程
我總共想了兩個方向的作法:
第一個方向 - 用一個pointer + 迴圈來檢查是不是0,並且進行splice和push的動作。
用while迴圈逐一去比對陣列每個數字,當發現是0的時候,就把這個數字拿出來往後放。
但是!!又把它拿出來檢討後,才發現這麼做其實會有一個問題!!(思慮不周的我,還以為這樣就完美完成,然後就這樣把答案交出去了QQ)
發現到的問題是「因為陣列的排序有變動,如果在這個狀況下跑迴圈,會有漏檢查的數字。」
例如:
目標排序陣列為[0, 0, 1, 0]
index會在第一次排成[0, 1, 0, 0]後,被+1,但是這樣就檢查不到原本index為1的數字,如果原本index為1的數字又剛好是0的話,就無法達成這題的需求。
為了解決這個問題,我又改了一個寫法。
但是!!又發現一個問題,這個做法會造成太多多餘的迴圈檢查步驟,讓時間限制超過。
第二個方向 - 用insertion sort(有兩個pointer)的方式進行排序。
因為上面的方向都沒有找到比較完美的解法,所以就又回頭去複習一下之前學的演算法內容,找到了一個比較合適的方法「insertion sort」,整體的實作方向用文字來解釋的話,就是「往後找出不等於0的數字,與數字0交換位置」。
每個小步驟的說明
1. 準備兩個pointer(我這邊命名為leftIndex和rightIndex),兩個都是從陣列的index 0為起點。
2. 一開始pointer還在相同起點時,如果指到的數字為0,rightIndex會被+1,目的是繼續往後查找不為0的數字;如果數字不為0的話,就存下rightIndex的數字,與leftIndex的數字做交換,目的是將不為0的數字往前排,排定過後需要把rightIndex和leftIndex都+1,目的是要能繼續往後檢查還沒排定的數字。
3. 整體步驟以迴圈來進行,當rightIndex等於array長度就不要再繼續做檢查的動作,也代表每個數字都檢查過一次了。
完整程式碼內容
方向二初版
方向二優化版
- 11月 13 週日 202208:28
【LeetCode刷刷】 Move Zeroes(移動數字零)
文章標籤
全站熱搜
