LeetCode.1089-重復(fù)的0(Duplicate Zeros)

這是小川的第392次更新,第423篇原創(chuàng)

01 看題和準(zhǔn)備

今天介紹的是LeetCode算法題中Easy級別的第255題(順位題號是1089)。給定一個固定長度的整數(shù)數(shù)組arr,復(fù)制每次出現(xiàn)的零,將剩余的元素向右移動。

請注意,不會寫入超出原始數(shù)組長度的元素。

對輸入數(shù)組進(jìn)行上述修改,不要從函數(shù)返回任何內(nèi)容。

例如:

輸入:[1,0,2,3,0,4,5,0]
輸出:null
說明:調(diào)用函數(shù)后,輸入數(shù)組被修改為:[1,0,0,2,3,0,0,4]

輸入:[1,2,3]
輸出:null
說明:調(diào)用函數(shù)后,輸入數(shù)組被修改為:[1,2,3]

注意

  • 1 <= arr.length <= 10000

  • 0 <= arr [i] <= 9

02 第一種解法

新建一個List,遍歷arr中的元素,如果為0,添加兩次到List中,然后將List中的前n個元素回寫到arr中,narr的長度。

public void duplicateZeros(int[] arr) {
    List<Integer> list = new ArrayList<Integer>();
    for (int num : arr) {
        if (num == 0) {
            list.add(0);
        }
        list.add(num);
    }
    for (int i=0; i<arr.length; i++) {
        arr[i] = list.get(i);
    }
}


03 第二種解法

我們也可以不使用List,將arr復(fù)制一份出來,創(chuàng)建一個索引,遍歷復(fù)制數(shù)組,將元素回寫到arr中,遇到0就重復(fù)賦值一次。

public void duplicateZeros2(int[] arr) {
    int n = arr.length, index = 0;
    int[] copy = arr.clone();
    for (int num : copy) {
        if (index >= n) {
            break;
        }
        if (index+1 < n && num == 0) {
            arr[index++] = 0;
            arr[index++] = 0;
        } else {
            arr[index++] = num;
        }
    }
}


04 第三種解法

我們也可以不使用額外的空間,通過雙指針來實(shí)現(xiàn)。

先遍歷arr,統(tǒng)計(jì)其中元素值為0的元素個數(shù),記為count,從后往前遍歷,一個長度為arr的長度,另外一個長度為arr的長度加count,遇到0就重復(fù)回寫一次。

public void duplicateZeros3(int[] arr) {
    int count = 0;
    for (int num : arr) {
        if (num == 0) {
            count++;
        }
    }
    int n = arr.length, n2 = n + count;
    // i是原數(shù)組的索引,j是原數(shù)組的長度加count
    for (int i=n-1, j= n2-1; i < j; i--, j--) {
        if (arr[i] != 0) {
            if (j < n) {
                arr[j] = arr[i];
            }
        } else {
            // 遇到0,再重復(fù)一次
            if (j < n) {
                arr[j] = arr[i];
            }
            j--;
            if (j < n) {
                arr[j] = arr[i];
            }
        }
    }
}


05 小結(jié)

算法專題目前已連續(xù)日更超過八個月,算法題文章261+篇,公眾號對話框回復(fù)【數(shù)據(jù)結(jié)構(gòu)與算法】、【算法】、【數(shù)據(jù)結(jié)構(gòu)】中的任一關(guān)鍵詞,獲取系列文章合集。

以上就是全部內(nèi)容,如果大家有什么好的解法思路、建議或者其他問題,可以下方留言交流,點(diǎn)贊、留言、轉(zhuǎn)發(fā)就是對我最大的回報(bào)和支持!

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

相關(guān)閱讀更多精彩內(nèi)容

  • 第四天 數(shù)組【悟空教程】 第04天 Java基礎(chǔ) 第1章數(shù)組 1.1數(shù)組概念 軟件的基本功能是處理數(shù)據(jù),而在處理數(shù)...
    Java幫幫閱讀 1,681評論 0 9
  • 1.用js實(shí)現(xiàn)隨機(jī)選取10~100之間的10個數(shù)字,存入一個數(shù)組,并排序 //要是獲取不重復(fù)的,則對隨機(jī)數(shù)...
    persistlu閱讀 5,874評論 0 0
  • 回溯算法 回溯法:也稱為試探法,它并不考慮問題規(guī)模的大小,而是從問題的最明顯的最小規(guī)模開始逐步求解出可能的答案,并...
    fredal閱讀 13,994評論 0 89
  • 排序算法說明 (1)排序的定義:對一序列對象根據(jù)某個關(guān)鍵字進(jìn)行排序; 輸入:n個數(shù):a1,a2,a3,…,an 輸...
    code武閱讀 744評論 0 0
  • (想到哪說到哪,目測還是沒邏輯) 學(xué)習(xí)電影已經(jīng)滿兩年,剛和室友討論了一下未來。我們兩個都是學(xué)電影的,她是剪輯專業(yè),...
    LISAAASJ閱讀 283評論 0 0

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