常見數(shù)組面試題

都是血的教訓(xùn)啊点把,為什么沒早點刷點面試題......

數(shù)組扁平化

1. 遞歸

    const flatten1 = (arr) => {
        let temp = [];
        for(let item of arr) {
            if(item instanceof Array) {
                temp = [...temp, ...(fn1(item))];
            } else {
                temp.push(item)
            }
        }
        return temp;
    }

2. toString()和split()

    let arr1 = [1, 2, [3, [4, [5, 6, 7, 'haha', 8]], [9, 10, [11, 12]]]]
    const flatten2 = (arr) => {
        let str = arr.toString();
        return str.split(',')
    }
    console.log(flatten2(arr1))
    // [ '1', '2', '3', '4', '5', '6', '7', 'haha', '8', '9', '10', '11', '12' ]
    // 可以看出來這種方法的缺陷在于把所有的元素都變成string了

3. reduce

    const flatten3 = (arr) => {
        return arr.reduce((previous, current) => {
            return previous.concat(Array.isArray(current) ? fn3(current) : current)
        }, []);
    }

4. concat結(jié)合解構(gòu)

    const flatten4 = (arr) => {
        while(arr.some(item => Array.isArray(item))) {
            arr = [].concat(...arr); // 這里其實相當于給concat傳了多個參數(shù),如果是數(shù)組的參數(shù)就解構(gòu)
        }
        return arr;
    }

數(shù)組去重

1. indexOf

這種方法在使用時痛黎,每一個元素都要使用indexOf去判斷一下靖苇,這就依賴于indexOf的效率了,如果indexOf是遍歷res數(shù)組的話,那么效率就是O(n)配并,整體就是O(n^2)

    let array = [1, 1, '1'];

    const unique1 = (array) => {
        var res = [];
        for (let i = 0, len = array.length; i < len; i++) {
            var current = array[i];
            if (res.indexOf(current) === -1) {
                res.push(current)
            }
        }
        return res;
    }

    console.log(unique1(array));

2. 排序后去重

取決于排序的效率,如果采用內(nèi)置的sort可以達到O(nlogn)

    const unique2 = (array) => {
        var res = [];
        var sortedArray = array.concat().sort();
        var pre; // pre存儲著前一項的值
        for (var i = 0, len = sortedArray.length; i < len; i++) {
            // 如果是第一個元素或者相鄰的元素不相同
            if (!i || pre !== sortedArray[i]) {
                res.push(sortedArray[i])
            }
            pre = sortedArray[i];
        }
        return res;
    }

3. 利用filter

    const unique3 = (arr) => {
        return arr.filter((item, index, array) => {
            return arr.indexOf(item) === index; // 此處可以保證是第一次出現(xiàn)的
        })
    }

    const unique4 = (arr) => {
        return arr.concat().sort().filter((item, index, array) => {
            return !index || item != array[index - 1];
        })
    }

4. 利用map鍵值對

    
    const unique5 = (array) => {
        var obj = {};
        return array.filter(function(item, index, array){
            return obj.hasOwnProperty(item) ? false : (obj[item] = true)
        })
    }

    // 缺陷在于對于[1, '1', 2, '2']這種會判斷失誤高镐,但是可以通過優(yōu)化來解決

5. Set

    const unique6 = (array) => {
        return [...new Set(array)];
    }

找出缺少的數(shù)組項

一個數(shù)組length = 99,里面的數(shù)組項是1~100的值溉旋,且無重復(fù),找出缺少的那一個值

    const fn = arr => {
        const sum = (1 + 100) * 50;
        let sum1 = 0;
        for(let num of arr) {
            sum1 += num;
        }
        return sum - sum1;  // 利用求和來求得缺少的那個值
    }


    const fn1 = arr => {
        let res = arr[0];
        for(let i = 1; i < arr.length; i++) {
            res = res ^ arr[i];
        }
        for(let i = 1; i <= 100; i++) {
            res = res ^ i;
        }
        // 利用異或運算來求
        return res;
    }

    // 創(chuàng)建hash表嫉髓,初始值都為0观腊,遍歷數(shù)組邑闲,出現(xiàn)的數(shù)字將hash表中的值改為1,再遍歷一遍hash表梧油,找出值為0的就是缺少的值

如果length = 98苫耸,找出缺少的兩個

    // hash表

更好的辦法是將各個數(shù)組項歸位,詳細代碼下班后再寫儡陨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褪子,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子骗村,更是在濱河造成了極大的恐慌褐筛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叙身,死亡現(xiàn)場離奇詭異渔扎,居然都是意外死亡,警方通過查閱死者的電腦和手機信轿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門晃痴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人财忽,你說我怎么就攤上這事倘核。” “怎么了即彪?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵紧唱,是天一觀的道長。 經(jīng)常有香客問我隶校,道長漏益,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任深胳,我火速辦了婚禮绰疤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舞终。我一直安慰自己轻庆,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布敛劝。 她就那樣靜靜地躺著余爆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夸盟。 梳的紋絲不亂的頭發(fā)上蛾方,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音,去河邊找鬼转捕。 笑死作岖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的五芝。 我是一名探鬼主播痘儡,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼枢步!你這毒婦竟也來了沉删?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤醉途,失蹤者是張志新(化名)和其女友劉穎矾瑰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隘擎,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡殴穴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了货葬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片采幌。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖震桶,靈堂內(nèi)的尸體忽然破棺而出休傍,到底是詐尸還是另有隱情,我是刑警寧澤蹲姐,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布磨取,位于F島的核電站,受9級特大地震影響柴墩,放射性物質(zhì)發(fā)生泄漏忙厌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一拐邪、第九天 我趴在偏房一處隱蔽的房頂上張望慰毅。 院中可真熱鬧,春花似錦扎阶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至犀农,卻和暖如春惰赋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工赁濒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轨奄,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓拒炎,卻偏偏與公主長得像挪拟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子击你,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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

  • 排序算法說明 (1)排序的定義:對一序列對象根據(jù)某個關(guān)鍵字進行排序玉组; 輸入:n個數(shù):a1,a2,a3,…,an 輸...
    code武閱讀 658評論 0 0
  • Ba la la la ~ 讀者朋友們,你們好啊丁侄,又到了冷鋒時間惯雳,話不多說,發(fā)車鸿摇! 1.冒泡排序(Bub...
    王飽飽閱讀 1,794評論 0 7
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,233評論 0 4
  • Javascript有很多數(shù)組的方法石景,有的人有W3C的API,還可以去MDN上去找拙吉,但是我覺得API上說的不全潮孽,M...
    頑皮的雪狐七七閱讀 4,081評論 0 6
  • 思維模式 1.我們的目標:學(xué)會用它而不是研究它是個什么必逆。 像老師說的怠堪,如果你想開燈,找到那個開關(guān)就好了名眉,沒必要去...
    一心小茶客閱讀 441評論 0 5