001、移動(dòng)零(簡(jiǎn)單)

題目:給定一個(gè)數(shù)組 nums,編寫一個(gè)函數(shù)將所有 0 移動(dòng)到數(shù)組的末尾,同時(shí)保持非零元素的相對(duì)順序。

示例:

輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
說明:

必須在原數(shù)組上操作,不能拷貝額外的數(shù)組。盡量減少操作次數(shù)。

五遍刷題法

第一遍:完成

  • 5分鐘:讀題 + 思考
  • 直接看解法:注意!多解法,分析時(shí)間和空間復(fù)雜度,來比較解法優(yōu)劣
  • 背誦、默寫好的解法

解題思路:
1、loop count zeros(第一次循環(huán)先把非零元素放到數(shù)組前面,記錄0的個(gè)數(shù),再遍歷數(shù)組,將count個(gè)最后的元素置零)
2、開一個(gè)新的數(shù)組將非零元素添加到新數(shù)組中,再在數(shù)組結(jié)尾添0(題干提示不允許)
3、直接在數(shù)組上操作index,把非零元素都移動(dòng)到數(shù)組前面。

解法一:兩次循環(huán)

class Solution {
    public void moveZeroes(int[] nums) {
        if(nums==null) {
            return;
        }
        //第一次遍歷的時(shí)候,j指針記錄非0的個(gè)數(shù),只要是非0的統(tǒng)統(tǒng)都賦給nums[j]
        int j = 0;
        for(int i=0;i<nums.length;++i) {
            if(nums[i]!=0) {
                nums[j++] = nums[i];
            }
        }
        //非0元素統(tǒng)計(jì)完了,剩下的都是0了
        //所以第二次遍歷把末尾的元素都賦為0即可
        for(int i=j;i<nums.length;++i) {
            nums[i] = 0;
        }
    }
}

解法二:違背題意
解法三:雙指針

class Solution {
    public void moveZeroes(int[] nums) {
        //雙指針的解法

        //j記錄非零元素的位置
        int j = 0;
        for(int i = 0; i < nums.length; i++){
            if(nums[i] != 0){
                if(i != j){
                    //交換兩個(gè)元素
                    nums[j] = nums[i];
                    nums[i] = 0;
                }
                j++;
            }
            //nums[i] == 0就不管
        }
    }
}

第二遍完成

  • 馬上自己寫 —> LeetCode 提交
  • 多種解法比較、體會(huì) —> 優(yōu)化!

第三遍待完成

  • 過了一天后,再重復(fù)做題
  • 不同解法的熟練程度 —> 專項(xiàng)練習(xí)

第四遍待完成

  • 過了一周:反復(fù)回來練習(xí)相同題目

第五遍待完成

  • 面試前一周恢復(fù)性訓(xùn)練
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容