最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript?算法實(shí)現(xiàn)復(fù)寫(xiě)0雙指針解法

 更新時(shí)間:2022年11月04日 08:44:19   作者:字節(jié)逆旅  
這篇文章主要為大家介紹了JavaScript?算法?復(fù)寫(xiě)0雙指針解法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

題目描述

給你一個(gè)長(zhǎng)度固定的整數(shù)數(shù)組 arr ,請(qǐng)你將該數(shù)組中出現(xiàn)的每個(gè)零都復(fù)寫(xiě)一遍,并將其余的元素向右平移。

注意:請(qǐng)不要在超過(guò)該數(shù)組長(zhǎng)度的位置寫(xiě)入元素。請(qǐng)對(duì)輸入的數(shù)組 就地 進(jìn)行上述修改,不要從函數(shù)返回任何東西。  

示例 1:

輸入: arr = [1,0,2,3,0,4,5,0]
輸出: [1,0,0,2,3,0,0,4]
解釋: 調(diào)用函數(shù)后,輸入的數(shù)組將被修改為:[1,0,0,2,3,0,0,4]

示例 2:

輸入: arr = [1,2,3]
輸出: [1,2,3]
解釋: 調(diào)用函數(shù)后,輸入的數(shù)組將被修改為:[1,2,3]

提示:

1 <= arr.length <= 104

0 <= arr[i] <= 9

題解

題目表示把原數(shù)組中的零都復(fù)寫(xiě)一遍,看示例應(yīng)該能明白什么意思,就是單純地把原數(shù)組中為0的元素重復(fù)寫(xiě)一遍,復(fù)寫(xiě)的元素要把原索引位后面的元素往后擠一個(gè)位置出來(lái),這樣原數(shù)組中每出現(xiàn)一個(gè)0,新數(shù)組就將從原數(shù)組中擠掉一個(gè)末位的元素。

對(duì)比新舊兩個(gè)數(shù)組,會(huì)發(fā)現(xiàn)新數(shù)組中的所有元素都來(lái)自舊數(shù)組,而新數(shù)組中只用到舊數(shù)組中左側(cè)的一部分元素,如果用i來(lái)表示舊數(shù)組的索引,在遍歷結(jié)束后新數(shù)組中用到的舊數(shù)組中的索引位應(yīng)該是0-i,且i<arr.length。也就是新數(shù)組中的指針增加到arr.length - 1時(shí),舊數(shù)組的指針停留在i,這時(shí)就出現(xiàn)了快慢指針的場(chǎng)景了。

前面定義了慢指針i,用來(lái)標(biāo)記舊數(shù)組;再定義一個(gè)快指針j,用來(lái)標(biāo)記新數(shù)組。

分幾步走:

  • 計(jì)算出快慢指針
  • 推算快慢指針規(guī)律
  • 從后往前覆寫(xiě)舊數(shù)組

這里主要講下規(guī)律,如果實(shí)在不行,可以舉例推演:

例1:

[0,1,2] >> i= 1

[0,0,1] >> j=2

例2:

[1,0,2,0,3] >> i = 3

[1,0,0,2,0] >> j = 4

例3:

[1,0,2,3,4] >> i = 3

[1,0,0,2,3] >> j = 4

基本上我可以靠人肉智能直接寫(xiě)出來(lái),從左往右,非零直接寫(xiě),遇到0寫(xiě)兩遍,直到棧頂。例2和例3的快慢指針是一樣的,他們區(qū)別的點(diǎn)是最后一個(gè)元素,一個(gè)是0一個(gè)不是0。如果定義一個(gè)變量,按照前面人肉智能的邏輯,用來(lái)表示舊數(shù)組的元素要在新數(shù)據(jù)寫(xiě)的次數(shù)之和t,這個(gè)區(qū)別就出來(lái)了:第一個(gè)是3,第二個(gè)是6(后面的一個(gè)0沒(méi)位置了),第三個(gè)是5。最后一個(gè)數(shù)要么是0,要么不是0,如果是0,t肯定比arr.length大1。

其實(shí)快指針的值j是固定的就是arr.length - 1,按這思路可以求出慢指針:

    const n = arr.length;
    let top = 0; // 新數(shù)組不計(jì)溢出時(shí)需要添加的個(gè)數(shù)
    let i = -1; // 舊數(shù)組的索引位,top到頂點(diǎn)時(shí)i停止
    while (top < n) {
        i++;
        if (arr[i] !== 0) {
            top++;
        } else {
            top += 2;
        }
    }

算出慢指針i的值,新數(shù)組中的元素就定好了,接下來(lái)就是把值塞進(jìn)去,因?yàn)轭}目要求不能定義新數(shù)組,要塞進(jìn)去就只能從后面塞。具體代碼如下:

/**
 * @param {number[]} arr
 * @return {void} Do not return anything, modify arr in-place instead.
 */
var duplicateZeros = function(arr) {
    const n = arr.length;
    let top = 0; // 新數(shù)組的極限索引
    let i = -1; // 舊數(shù)組的索引位,top到頂點(diǎn)時(shí)i停止
    while (top < n) {
        i++;
        if (arr[i] !== 0) {
            top++;
        } else {
            top += 2;
        }
    }
    let j = n - 1;
    if (top === n + 1) { 
        // 超出原數(shù)組兩個(gè)索引位,說(shuō)明最后一位是0
        arr[j] = 0;
        j--;
        i--;
    } 
    // i是原數(shù)組索引位,新數(shù)組只用到0-i的元素
    while (j >= 0) {
        arr[j] = arr[i];
        j--;
        // 如果當(dāng)前i索引位是0,則新數(shù)組還要向后退一位且用0賦值
        if (arr[i] === 0) {
            arr[j] = arr[i];
            j--;
        } 
        i--;
    }
};

復(fù)雜度

時(shí)間復(fù)雜度:O(n)

空間復(fù)雜度:O(1)

以上就是JavaScript 算法 復(fù)寫(xiě)0雙指針解法的詳細(xì)內(nèi)容,更多關(guān)于JavaScript 復(fù)寫(xiě)0雙指針解法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JS實(shí)現(xiàn)響應(yīng)鼠標(biāo)點(diǎn)擊動(dòng)畫(huà)漸變彈出層效果代碼

    JS實(shí)現(xiàn)響應(yīng)鼠標(biāo)點(diǎn)擊動(dòng)畫(huà)漸變彈出層效果代碼

    這篇文章主要介紹了JS實(shí)現(xiàn)響應(yīng)鼠標(biāo)點(diǎn)擊動(dòng)畫(huà)漸變彈出層效果代碼,具有非常自然流暢的動(dòng)畫(huà)過(guò)度效果,涉及JavaScript針對(duì)鼠標(biāo)事件的響應(yīng)及頁(yè)面元素樣式的動(dòng)態(tài)操作相關(guān)技巧,需要的朋友可以參考下
    2016-03-03
  • Javascript讀取json文件方法實(shí)例總結(jié)

    Javascript讀取json文件方法實(shí)例總結(jié)

    json文件是一種輕量級(jí)的數(shù)據(jù)交互格式,下面這篇文章主要給大家介紹了關(guān)于Javascript讀取json文件方法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • 使用JS組件實(shí)現(xiàn)帶ToolTip驗(yàn)證框的實(shí)例代碼

    使用JS組件實(shí)現(xiàn)帶ToolTip驗(yàn)證框的實(shí)例代碼

    這篇文章主要介紹了使用JS組件實(shí)現(xiàn)帶ToolTip驗(yàn)證框的實(shí)例代碼,需要的朋友可以參考下
    2017-08-08
  • 基于JavaScript實(shí)現(xiàn)簡(jiǎn)單的音頻播放功能

    基于JavaScript實(shí)現(xiàn)簡(jiǎn)單的音頻播放功能

    本文給大家?guī)?lái)了基于js實(shí)現(xiàn)簡(jiǎn)單的音頻播放功能,數(shù)據(jù)是由后臺(tái)提供的,具體實(shí)例代碼大家參考下本文
    2018-01-01
  • JavaScript實(shí)現(xiàn)打開(kāi)鏈接頁(yè)面的方式匯總

    JavaScript實(shí)現(xiàn)打開(kāi)鏈接頁(yè)面的方式匯總

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)打開(kāi)鏈接頁(yè)面的方式,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • 移動(dòng)端js圖片查看器

    移動(dòng)端js圖片查看器

    這篇文章主要為大家詳細(xì)介紹了js圖片查看器的制作方法,可以實(shí)現(xiàn)圖片的滑動(dòng)等效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Bootstrap基本插件學(xué)習(xí)筆記之Alert警告框(20)

    Bootstrap基本插件學(xué)習(xí)筆記之Alert警告框(20)

    這篇文章主要為大家詳細(xì)介紹了Bootstrap基本插件學(xué)習(xí)筆記之ALert警告框的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • window.open以post方式將內(nèi)容提交到新窗口

    window.open以post方式將內(nèi)容提交到新窗口

    最近在做web項(xiàng)目,碰到需要跨頁(yè)面?zhèn)鬟f參數(shù)的功能,就是那種需要把當(dāng)前頁(yè)面的內(nèi)容帶到新開(kāi)的子窗體中,以前的做法是傳一個(gè)id過(guò)去,然后在新窗口中去讀數(shù)據(jù)庫(kù)的內(nèi)容;比較有意思的是直接通過(guò)調(diào)用form的submit方法不能觸發(fā)onsubmit事件,查看了幫助文檔,必須手動(dòng)的觸發(fā),否則只能看到頁(yè)面刷新而沒(méi)有打開(kāi)新窗口
    2012-12-12
  • Javascript學(xué)習(xí)筆記 delete運(yùn)算符

    Javascript學(xué)習(xí)筆記 delete運(yùn)算符

    關(guān)于javascript的delete運(yùn)算符,MDN里有相關(guān)文檔。以下是我的學(xué)習(xí)筆記,更多是要關(guān)注特殊情況的使用和注意點(diǎn)。
    2011-09-09
  • Javascript實(shí)現(xiàn)運(yùn)算符重載詳解

    Javascript實(shí)現(xiàn)運(yùn)算符重載詳解

    本文給大家匯總介紹了Javascript實(shí)現(xiàn)運(yùn)算符重載的方法,實(shí)現(xiàn)的思路很簡(jiǎn)單,有需要的小伙伴可以來(lái)看看
    2018-04-04

最新評(píng)論

古田县| 秭归县| 南乐县| 安仁县| 大埔区| 谷城县| 临泉县| 双桥区| 南通市| 永仁县| 绥江县| 沅陵县| 安顺市| 长垣县| 玛多县| 修武县| 神木县| 广元市| 铜山县| 盐源县| 扬中市| 策勒县| 常宁市| 黑龙江省| 临猗县| 息烽县| 海原县| 远安县| 精河县| 东至县| 阜南县| 清流县| 诸城市| 东港市| 肥西县| 沂水县| 龙陵县| 平果县| 青河县| 葵青区| 漠河县|