位元組跳動web前端面試經歷

蒙面大蝦發表於2019-02-21

都說今年是網際網路的寒冬,由於個人原因想要換個地方工作,所以在某boss上投遞了簡歷,當天就收到諸多boss的訊息,讓我傳送簡歷,其中就包括我想去的宇宙條。宇宙條的效率是真的很高,收到簡歷後沒多久就打電話過來約面試時間,由於本人是異地,故只能接受電話/視訊面試。很快確定了面試時間和方式,宇宙條的面試可安排在週末,由此便可知道其“加班定律”。我面試的崗位是web前端開發工程師崗,座標北京。

面試鐵律

自我介紹,基本上這是開啟激戰的導火索。順便一提,宇宙條的視訊面試是在牛客網上,可進行編碼,視訊,語音,文字溝通。面試官可以實時看到應聘者當前頁面的內容和操作。

基礎題

1.display的取值和各種值的區別?

2.相鄰的兩個inline-block節點為什麼會出現間隔,該如何解決?

3.用過nodejs中的EventEmitter嗎?詳細講講。

4.前端效能優化有哪些?

5.講簡歷中提到的一個專案,並且講解服務端渲染和前端渲染的優缺點?為什麼你的專案會選擇服務端渲染?

6.講講CSRF。

7.ts和js的區別,為什麼要選擇使用ts?

演算法題

找出陣列中和為給定值的兩個元素,如:[1, 2, 3, 4, 5]中找出和為6的兩個元素。

題目很清晰,也很容易理解,相信很多小夥伴看到這個題都能直觀地用“氣泡排序”的方法解決,但是氣泡排序的時間複雜度明顯不是我們想要的結果,我把我能夠想到的幾種方法由易到難記錄下來:

氣泡排序的方式

function getNum(arr, sum) {
    if (!Array.isArray(arr)) return null;

    for (var i = 0; i < arr.length - 1; i++) {
        if (arr[i] > sum) continue;

        for (var j = 0; j < arr.length; j++) {
            if (arr[j] > sum) continue;

            if (arr[i] + arr[j] == sum) return [arr[i], arr[j]];
        }
    }

    return null;
}
複製程式碼

這種解法很容易想到,也很容易理解,我們不多過多的講解,接下來分享一種上述解法的優化版。

查詢的方式

最終的結果是要找到和為sum的兩個數,那麼我們可以轉換一種思路:預設第一個num1數已經存在,那麼第二個數就是sum - num1,這就轉換為從陣列中查詢的問題了。雖然和第一種方法很像,但是在有序數列中進行查詢明顯要快於逐個比較。

function getNum(arr, sum) {
    if (!Array.isArray(arr)) return null;

    arr.sort();

    for (var i = 0; i < arr.length - 1; i++) {
        if (arr[i] > sum) continue;

        var restNum = sum - arr[i];

        // 考慮下為什麼要 > i
        if (arr.indexOf(restNum) > i) return [arr[i], restNum];
    }

    return null;
}
複製程式碼

這種解法的前提是需要對陣列進行排序(快排),故時間複雜度為O(nlogn),二分查詢的時間複雜度為O(log2n),最壞的情況是遍歷了整個陣列,即時間複雜度為O(n),那麼整體的時間複雜度為O(nlog2n),效果上要優於氣泡排序的方式。

快排方式

同樣需要對陣列進行排序(升序),我們知道排序後的陣列必然是左邊的數不會超過右邊的數,因此我們可以把左邊的數和右邊的數的和作為基準值來和目標值比較,如果該值小於目標值,那麼代表兩個加數的值不夠大,右邊的值已經到達頂峰了,那麼就從左邊取下一個值相加和目標值比較,如果該值比目標值大,那麼表示右邊的值太大了,需要獲取一個小一點的加數,這時需要從右邊取倒數第二個數相加後比較,如果此時的值和目標值相等,恭喜你,我的小乖乖,原來你倆在這裡!說了這麼多感覺還是一頭霧水的同學直接看程式碼吧,畢竟我們都是同一類猿:-)

function getNum(arr, sum) {
    if (!Array.isArray(arr)) return null;

    arr.sort();

    for (var i = 0, j = arr.length - 1; i < j;) {
        if (arr[i] + arr[j] < sum) i++;

        else if (arr[i] + arr[j] > sum) j--;

        else return [arr[i], arr[j]];
    }

    return null;
}
複製程式碼

這種方法我是受到了快速排序的啟發,所以命名為快速排序的方式,它是目前為止我能想到效率最高的解決方案,時間複雜度為O(nlogn)。如果需求是找出所有對組合,只要控制退出條件即可,難度不大故不做討論。

總結

首先說下最終的結果吧,跪了!不得不說宇宙條的效率很高,從簡歷採集到最終出結果全程可以和HR進行交流,面試前夕也會電話確認,面試結束後會有一個面試評價,好像是每輪面試都有,網上匿名填寫,面試的結果在當天或是1-2個工作日會通過郵件的形式傳送給你。

再說說自己吧,面試之前就沒有備足功課,一方面,當前的工作強度較大,天天加班的前提下抽出時間去學習是件奢侈的事情,只能在工作中邊做事情邊積累。另一方面,自己之前面試結果都很滿意,所以有點飄了。導致這次面試自我介紹都有點結結巴巴,後面的問題也是很難用語言準確表達出來,提到這裡我個人感覺面試官還是很和藹的,看到我的處境說寫出來就可以了。

基礎題看上去都很簡單,所以我就沒有寫答案,有興趣的小夥伴可以留言你自己的答案。本人雖然是計算機專業但是演算法一直不算是我的強項,本次面試最讓我傷心的就是演算法題,面試完成後一直都在考慮具體的解法,在時間的發酵下總算有了一點點收貨,還是值得慶幸的事情。

接下來一段時間還是要系統地總結和學習,不管是不是為了面試,既然選擇了這一行就應該努力充實自己,等自己變得足夠強的時候,自然是別人認可你的時候!最後也預祝和我一樣想要換工作的小夥伴都能收到心儀公司的offer:-)。

相關文章