大廠面經: 位元組跳動 iOS開發實習生-飛書

养肥胖虎發表於2024-07-31

好傢伙,

線上面試,總時長1h30mins左右

整體流程:

0.自我介紹(0-2mins)

1.做的比較難的事情(15min)

我講我之前寫的一個低開平臺,寫了一個撤銷回退功能,提了個pr,用了節流,用了命令模式

1.1.節流怎麼用的?用在哪?為什麼用?

1.2.節流把前面的觸發直接clean了還是怎麼處理?會不會清除掉一些關鍵變化?

1.3會不會導致某些變化無法觸發?如何更好的最佳化?

2.前端知識+計算機四大件拷打(25min)

2.1.使用者態和核心態的區別?

(忘了,直接跳)

2.2. https或者http連線過程發生了什麼?

講了tcp, dns代理返回ip

接著問2.2.1.TCP三次握手過程?

2.2.2.握手過程中唯一識別符號作用?

2.2.3.DNS解析過程,如何解析?

2.3. TCP/IP協議多少層?每層作用?

  2.3.1.為什麼要分層?

2.4. 有沒有用過Rust?(每太聽清楚問的什麼,好像是這個)

  沒有,直接跳

2.5. 用過什麼設計模式,展開說?

我講了訂閱釋出模式,命令模式

2.5.1.命令模式解決了什麼問題?

2.5.2.釋出訂閱模式怎麼用的?解決了什麼問題?

2.6.用過什麼資料結構?為什麼用?怎麼用的?

  

2.7. 非同步有了解過嗎?講講非同步

3.演算法(35min)

3.1.演算法一(20min)

三數之和

題目描述

給你一個陣列,有N個數,怎麼判斷三個數之和等於某個數,每個數只能使用一次​

let number = [10, 21, 3, 14, 5...]​

input: 9​

output: true​

input:2​

output: false

要求程式碼實現

會寫

3.2.演算法二(10min)

資料來源:a->一,b->二 ,c->三,d->四

輸入: a 返回 [一、三], ab返回[三],b返回[二、四],bc返回[四]

要求給出思路,

面試官給了提示,說是類似拼音輸入法,用樹去實現

我妹答出來

4.最後反問(10min)

5.演算法答案補充

5.1.第一題:

function threeSum(nums, target) {
    nums.sort((a, b) => a - b);
    for (let i = 0; i < nums.length - 2; i++) {
        let left = i + 1;
        let right = nums.length - 1;

        while (left < right) {
            const sum = nums[i] + nums[left] + nums[right];

            if (sum === target) {
                return true;
            } else if (sum < target) {
                left++;
            } else {
                right--;
            }
        }
    }
    return false;
}

Array.sort的複雜度為O(nlogn)

外層迴圈為n-2,內層迴圈為n-1,算O(n^2)

平均複雜度為O(n^2)

5.2.第二題:

使用字首樹實現

一組單詞,adv,age,ant,ate,inn,int

用字首樹去儲存大概長這樣:

class TrieNode {
    constructor() {
        this.children = {};
        this.outputs = [];
    }
}

class Trie {
    constructor() {
        this.root = new TrieNode();
    }

    insert(key, output) {
        let node = this.root;
        for (const char of key) {
            if (!node.children[char]) {
                node.children[char] = new TrieNode();
            }
            node = node.children[char];
        }
        node.outputs.push(...output);
    }

    search(key) {
        let node = this.root;
        for (const char of key) {
            if (node.children[char]) {
                node = node.children[char];
            } else {
                return [];
            }
        }
        return node.outputs;
    }
}

// 初始化Trie樹
const trie = new Trie();
trie.insert('a', ['一', '三']);
trie.insert('ab', ['三']);
trie.insert('b', ['二', '四']);
trie.insert('bc', ['四']);

// 查詢
console.log(trie.search('a'));  // 輸出: ['一', '三']
console.log(trie.search('ab')); // 輸出: ['三']
console.log(trie.search('b'));  // 輸出: ['二', '四']
console.log(trie.search('bc')); // 輸出: ['四']

6.總結與反思

從整個整體的面試過程來看,大廠還是更加註重基礎,四大件和演算法,狠狠的補

相關文章