第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

從數(shù)組arr中去掉repeatArr,我能想到的最好的方法是遞歸,有沒有比較簡(jiǎn)潔的方法?

從數(shù)組arr中去掉repeatArr,我能想到的最好的方法是遞歸,有沒有比較簡(jiǎn)潔的方法?

尚方寶劍之說 2019-02-26 21:13:33
arr和repeatArr都不會(huì)出現(xiàn)重復(fù)項(xiàng),而且repeatArr一定是類似數(shù)學(xué)里的集合,repeatArr是屬于arr的`var arr = [1, 2, 3, 4, 5];var repeatArr = [1, 3];function distinct() {    for (var i = 0; i < arr.length; i++) {        for (var j = 0; j < repeatArr.length; j++) {            if (arr[i] == repeatArr[j]) {                arr.splice(i, 1);                distinct()                return false;            }        }    }}distinct();console.log(arr)
查看完整描述

2 回答

?
www說

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊

  1. 先把“去重”的概念說清楚吧。

  2. 去重這種,O(n) 的時(shí)間復(fù)雜度就夠了。


查看完整回答
反對(duì) 回復(fù) 2019-03-01
?
紫衣仙女

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊

先說一下原來的代碼。

做一個(gè)雙循環(huán)也并不需要用到遞歸,找到重復(fù)項(xiàng)原地踏步就行!

直接操作外部變量也不是一個(gè)好的選擇!


if (arr[i] == repeatArr[j]) {

    arr.splice(i, 1);

    i--

    break;

}

另外,

去重最常用的像上面說的,使用哈希,就不累贅了哈!


其實(shí)你可以從幾個(gè)方面考慮一下上面幾種答案。

1、是否純函數(shù)或者說是否直接修改外部變量

2、性能、復(fù)雜度

3、代碼可讀性(這個(gè)不說了,大家都有自己的見解)


    arr.filter(item => !repeatArr.includes(item))

    

    function fp(origin, repeat) {

      return origin.filter(item => !repeat.includes(item))

    }

第一種偏函數(shù)式,不影響外部,可以很輕松封裝成函數(shù),也方便復(fù)用!

復(fù)雜度也是O(n^2),上用大白話說,其實(shí)也就是雙循環(huán)。


    var arr = [1, 2, 3, 4, 5];

    var repeatArr = [1, 3];

    var map = {};

    $.map(repeatArr, function(v){map[v] = true})

    arr = $.map(arr, function(v){if(!map[v]){return v}})

    

    function hashMapUnique(origin, repeat) {

      let map = {};

      repeat.map(item => map[item] = true)

      return origin.filter(item => !map[item])

    }

第二種用也比較容易封裝成函數(shù)

哈希在數(shù)據(jù)訪問的時(shí)候比遍歷要快,在處理的量大的情況下,性能優(yōu)于第一種方法


剛剛還看到了第三種使用正則的。

還挺復(fù)雜的,最后數(shù)據(jù)類型也發(fā)生變化了。

沒有嘗試哈!


最后說一下你改以后的方法哈


for (var i = 0; i < repeatArr.length;i++) {

    var index = arr.indexOf(repeatArr[i]);

    arr.splice(index, 1);

}

就像yszou說的你的復(fù)雜度上沒有優(yōu)勢(shì)!

而且使用了splice方法,直接修改了原始數(shù)組不說,且這個(gè)方法本身就比較消耗性能的。

用大白話說,splice在刪除那一項(xiàng)以后,得把該項(xiàng)以后的每一項(xiàng)都前移一位!

可讀性上面我就不評(píng)論了哈·~~~


查看完整回答
反對(duì) 回復(fù) 2019-03-01
  • 2 回答
  • 0 關(guān)注
  • 811 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)