LeetCode0283-移動零
阿新 • • 發佈:2021-10-30
雙指標
比較具有利用指標特性的一題
題目
給定一個數組 nums,編寫一個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。示例:
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
題解
因為想用雙指標所以用了雙指標,但是個人感覺對雙指標的理解還是比較有利的 主要是利用兩個指標checker和book,前者用來遍歷,後者用來處理 核心在於:當checker檢測到0的時候,book不會行動 而當其檢測到非零數的時候,book會更新且移動 當checker移動到終點時,所有應該加入的非零數已經被添加了,那麼剩下的就都是0了 於是,只要把此時book後面的數全部填充為0即可
class Solution { public void moveZeroes(int[] nums) { int n = nums.length ; int checker = 0 ; //查詢用 int book = 0; //轉換用 while(checker<n){ if(nums[checker]!= 0){ nums[book] = nums[checker]; book++; } checker++; } for(int i = book ; i<n ; i++){ nums[i] = 0 ; } } }
其中一個核心理解是:把book獨立於checker存在,因為在每次checker檢測的時候,book已經跟進更新資料了
而當checker檢測到0的時候,book是不會移動的,在檢測到0的時刻,checker和book處於同一個下標,
而下一時刻checker++
而 book不變,這樣book就被停留在了一個是0的下標處
而當下一次checker檢測到非0數的時候,book執行nums[book] = nums[checker];
從而抹去了這個零
因為前面的數都排好了,這次也更新了,於是book前進一個下標
如果checker連續檢測到了0,那麼book就會一直停留,直到checker檢測到非0數而更新