1. 程式人生 > 其它 >LeetCode0283-移動零

LeetCode0283-移動零

雙指標

比較具有利用指標特性的一題

題目

給定一個數組 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數而更新