JS數(shù)組去重的n種解法

已知排序的array,或者不在乎去重之后的結(jié)果順序

Solution 1
可以做一次循環(huán)脆侮,判斷當(dāng)前的item是否等于前面那個item锌畸,如果不等于或不存在前面的item,就pushresult中靖避。
時間復(fù)雜度:O(nlogn)
空間復(fù)雜度:O(n)

Array.prototype.uniq = function () {
    if (!this.length || this.length == 0) return this;
    this.sort();
    var res = [this[0]];
    for (var i = 1; i < this.length; i++) {
        if (this[i] != this[i - 1]) res.push(this[i]);
    }
    return res;
}

Solution 2
采用兩個指針lr潭枣,記錄不重復(fù)元素的位置,rl的下一個開始遍歷數(shù)組幻捏,如果r位置的數(shù)字等于l位置的數(shù)字盆犁,說明該數(shù)字重復(fù)出現(xiàn),不予處理篡九;如果r位置的數(shù)字不等于l位置的數(shù)字谐岁,說明該數(shù)字沒有重復(fù),需要放到l的下一位置榛臼,并使l1.
時間復(fù)雜度:O(nlogn)
空間復(fù)雜度:O(1)

Array.prototype.uniq = function () {
    if (!this.length || this.length == 0) return this;
    this.sort();
    var left = 0, right;
    for (right = left + 1; right < this.length; right++) {
        if (this[left] != this[right]) {
            this[++left] = this[right];
        }
    }
    return this.slice(0, left + 1);
}

Solution 3
數(shù)組先排序伊佃,比較倆數(shù)組一頭一尾進(jìn)行去重。

Array.prototype.uniq = function () {
    var res = [], end;
    this.sort();
    end = this[0], res.push(this[0]);
    for (var i = 1; i < this.length; i++) {
        if (this[i] != end) {
            res.push(this[i]);
            end = this[i];
        }
    }
    return res;
}

如果數(shù)組順序雜亂

Solution 1
可以做一次循環(huán)沛善,用一個對象標(biāo)記該item是否存在航揉。如果不存在,就pushresult中金刁。這里使用一個hashtable的結(jié)構(gòu)記錄已有的元素迷捧,這樣就可以避免內(nèi)層循環(huán)织咧。不過,假如數(shù)組非常龐大漠秋,這種做法的性能會差笙蒙。

Array.prototype.uniq = function () {
    var hash = {}, result = [], item;
    for (var i = 0; i < this.length; i++) {
        item = this[i]; 
        var key = Object.prototype.toString.call(item) + item;
        if (!hash[key]) {
            hash[key] = true;
            result.push(item);
        }
    }
    return result;
}

注意jshash的鍵值是以字符存儲的,所以會自動將數(shù)組元素轉(zhuǎn)為字符型庆锦,因此作為hash索引時需要加上類型捅位,否則無法區(qū)分?jǐn)?shù)字1和字符1
Solution 2
遍歷數(shù)組搂抒,建立新數(shù)組艇搀,利用indexOf判斷是否存在于新數(shù)組中,不存在則push到新數(shù)組求晶,最后返回新數(shù)組焰雕。時間復(fù)雜度為O(n^2)。

Array.prototype.uniq = function () {
    var ret = [];
    for (var i = 0; i < this.length; i++) {
        if (ret.indexOf(this[i]) == -1) {
            ret.push(arr[i]);
        }
    }
    return ret;
}

Solution 3
遍歷數(shù)組芳杏,利用object對象保存數(shù)組值矩屁,判斷數(shù)組值是否已經(jīng)保存在object中,未保存則push到新數(shù)組并用object[arrayItem] = 1的方式記錄保存爵赵。

Array.prototype.uniq = function () {
    var ret = [], tmp = [];
    for (var i = 0; i < this.length; i++) {
        if (!tmp[arr[i]]) {
            tmp[arr[i]] = 1;
            ret.push(arr[i]);
        }
    }
    return ret;
}

Solution 4
數(shù)組下標(biāo)判斷法吝秕。遍歷數(shù)組。利用indexOf判斷元素的值是否與當(dāng)前元素索引相等空幻,如相等則加入烁峭。

Array.prototype.uniq = function () {
    var res = [];
    var me = this;
    me.forEach(function (val, index) {
        if (me.indexOf(val) == index) 
           res.push(val);
    })
    return res;
}

可以用filter過濾。

Array.prototype.uniq = function () {
    var me = this;
    var res = me.filter(function (x, index) {
        return me.indexOf(x) == index;
    }); 
    return res;
}

Solution 5
將原數(shù)組中重復(fù)元素的最后一個元素放入結(jié)果數(shù)組中秕铛。

Array.prototype.uniq = function () {
    var res = [];
    for (var i = 0; i < this.length; i++) {
        for (var j = i + 1; j < this.length; j++) {
            if (this[i] == this[j]) j = ++i;
        }
        res.push(this[i]);
    }
    return res;
}

ES6

function unique(arr) {
  return Array,from(new Set(arr));
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末约郁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子但两,更是在濱河造成了極大的恐慌鬓梅,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镜遣,死亡現(xiàn)場離奇詭異,居然都是意外死亡士袄,警方通過查閱死者的電腦和手機(jī)悲关,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娄柳,“玉大人寓辱,你說我怎么就攤上這事〕嗑埽” “怎么了秫筏?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵诱鞠,是天一觀的道長。 經(jīng)常有香客問我这敬,道長航夺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任崔涂,我火速辦了婚禮阳掐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冷蚂。我一直安慰自己缭保,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布蝙茶。 她就那樣靜靜地躺著艺骂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隆夯。 梳的紋絲不亂的頭發(fā)上钳恕,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音吮廉,去河邊找鬼苞尝。 笑死,一個胖子當(dāng)著我的面吹牛宦芦,可吹牛的內(nèi)容都是我干的宙址。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼调卑,長吁一口氣:“原來是場噩夢啊……” “哼抡砂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起恬涧,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤注益,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后溯捆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丑搔,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年提揍,在試婚紗的時候發(fā)現(xiàn)自己被綠了啤月。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡劳跃,死狀恐怖谎仲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刨仑,我是刑警寧澤郑诺,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布夹姥,位于F島的核電站,受9級特大地震影響辙诞,放射性物質(zhì)發(fā)生泄漏辙售。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一倘要、第九天 我趴在偏房一處隱蔽的房頂上張望圾亏。 院中可真熱鬧,春花似錦封拧、人聲如沸志鹃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曹铃。三九已至,卻和暖如春捧杉,著一層夾襖步出監(jiān)牢的瞬間陕见,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工味抖, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留评甜,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓仔涩,卻偏偏與公主長得像忍坷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子熔脂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗佩研。 張土汪:刷leetcod...
    土汪閱讀 12,737評論 0 33
  • ¥開啟¥ 【iAPP實現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,365評論 0 17
  • 瀑布流 原理:1 每個元素的width相等霞揉,height不等旬薯;就像瀑布,水柱大小一樣适秩,長短各異绊序。2 所有元素用po...
    jrg_memo閱讀 340評論 0 0
  • 你又想陷入內(nèi)心的沉默 與影子跳起舞 在旋轉(zhuǎn)中 甩出孤獨(dú) 像我一樣自說自話 企圖分辨出我和我 妄想不再有你和我
    zheng1閱讀 258評論 0 1
  • 認(rèn)識不久的我們,很快進(jìn)入了戀愛狀態(tài)中秽荞,太快了骤公,但又不是不真實,我們很真實蚂会,約會聊天淋样,談?wù)劺硐牒氖剑幌抻谶@里胁住。 云大大...
    月墨簫風(fēng)閱讀 783評論 0 1