LeetCode筆記:283. Move Zeroes

這是一道難度爲Easy的問題,但不知道爲什麼,每次做我都會掉入思維誤區,想出超級複雜的方案。今天整理一下,以便加深印象。

問題

Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements.

分析

題目要求將數組中所有的0都移動到末尾,而其餘元素保持原順序。例如數組[0,1,0,3,12],操作後結果爲[1,3,12,0,0]。要求原地執行,且操作次數儘量少。

思路

一個指針i向前遍歷數組,一個指針j遇到0則停一次,每次循環j處元素都賦值爲i處元素。也就是在0未出現時,數組保持不變,0出現1次,i處元素向前移動1位,0出現2次,i處元素向前移動2位,以此類推。知道i指針遍歷結束,終止循環。此時自j指針開始直到數組末尾,都應該用0補位。

class Solution {
    public void moveZeroes(int[] nums) {
        if (nums == null) {
            return;
        }
        int j = 0;
        for (int i=0; i<nums.length; i++) {
            if (nums[i] != 0) {
                nums[j++] = nums[i];
            } 
        }
        for (; j<nums.length; j++) {
            nums[j] = 0;
        }   
    }    
}
總結

看到題目很容易往處理0的方向上思考,但這道題的解法妙就妙在處理非0,而不是處理0。提交上面的解法,會得到跑贏100%Java的提交的結果,真是生活中的小確幸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章