崗秋招筆試復(fù)盤:賽碼網(wǎng)避坑與算法沖刺指南)
2023年秋招那會(huì)兒我投了騰訊音樂的研發(fā)崗崗位是后端方向。筆試用的是賽碼網(wǎng)限時(shí)120分鐘題型是選擇題單選多選加3道編程題。說(shuō)實(shí)話在??途W(wǎng)上刷過(guò)不少大廠筆試但賽碼網(wǎng)這個(gè)平臺(tái)當(dāng)時(shí)用的人不算多環(huán)境陌生、輸入輸出格式又和平時(shí)練的不太一樣導(dǎo)致我開場(chǎng)那幾分鐘非常難受。這篇復(fù)盤我把整場(chǎng)筆試從收到郵件到交卷的每個(gè)環(huán)節(jié)都過(guò)一遍包括題目類型、踩坑點(diǎn)、時(shí)間分配和后續(xù)面試銜接給準(zhǔn)備走大廠研發(fā)崗秋招的同學(xué)做個(gè)參考。1. 收到筆試郵件之后我如何判斷這場(chǎng)筆試的考察重點(diǎn)1.1 從崗位描述反推考點(diǎn)騰訊音樂研發(fā)崗的JD寫得比較寬泛核心要求是扎實(shí)的計(jì)算機(jī)基礎(chǔ)、掌握至少一門服務(wù)端語(yǔ)言Java/C/Go都行、熟悉常見數(shù)據(jù)結(jié)構(gòu)和算法。但寬泛不等于沒重點(diǎn)我投的是TME的后臺(tái)研發(fā)筆試前我給自己圈定了四個(gè)考察方向算法與數(shù)據(jù)結(jié)構(gòu)、計(jì)算機(jī)網(wǎng)絡(luò)、操作系統(tǒng)、數(shù)據(jù)庫(kù)。另外考慮到騰訊音樂的業(yè)務(wù)場(chǎng)景是音視頻和社交娛樂字符串處理、高頻查詢類問(wèn)題比如排行榜、搜索建議出題概率會(huì)高于純粹的業(yè)務(wù)CRUD題。這個(gè)判斷基本被我后續(xù)在??秃托〖t書上看到的同批筆試回憶印證了。2023年騰訊系大廠筆試普遍壓縮了選擇題比重把大頭放在編程題上三題通常按難度遞進(jìn)第一題簽到性質(zhì)考察基本編碼能力和邊界處理第二題中等常見動(dòng)態(tài)規(guī)劃或貪心第三題偏難圖論、狀態(tài)壓縮或復(fù)雜模擬。騰訊音樂這場(chǎng)大致也是這個(gè)節(jié)奏所以我從收到郵件那天起就把復(fù)習(xí)重心放在LeetCode Hot 100和中高難度的動(dòng)態(tài)規(guī)劃、圖論題上。1.2 賽碼網(wǎng)筆試環(huán)境的提前適配很多同學(xué)忽視一個(gè)關(guān)鍵點(diǎn)賽碼網(wǎng)和??途W(wǎng)的在線IDE處理方式完全不一樣。牛客網(wǎng)代碼框內(nèi)寫題自動(dòng)保存輸入輸出已經(jīng)幫你處理好了。賽碼網(wǎng)雖然也內(nèi)置編輯器但它在瀏覽器兼容性、輸入格式、內(nèi)存報(bào)錯(cuò)提示上都更“原生”一些——意思就是你更接近在本地IDE里裸寫代碼沒有那么多智能提示。我提前兩天去賽碼網(wǎng)上找了幾套模擬題練手主要做了三件事第一確認(rèn)它支持哪些語(yǔ)言版本我用的是C確認(rèn)支持C17可以用一些新特性第二測(cè)試multi-case輸入模板賽碼網(wǎng)很多題目不會(huì)像LeetCode那樣給你封裝好函數(shù)而是要求自己讀while (cin n)這種循環(huán)第三驗(yàn)證本地編譯調(diào)試的流程賽碼網(wǎng)允許在編輯器里寫代碼再提交但調(diào)試信息輸出到日志區(qū)偶爾有延遲。這三天準(zhǔn)備幫我避開了最大的坑題目能做出來(lái)但因?yàn)檩斎胼敵龈袷讲徽_導(dǎo)致0分。下面細(xì)說(shuō)。2. 筆試現(xiàn)場(chǎng)全流程復(fù)盤選擇、多選與一道差點(diǎn)翻車的模擬題2.1 選擇題部分的時(shí)間分配與心態(tài)整場(chǎng)筆試120分鐘我的計(jì)劃是選擇題控制在40分鐘以內(nèi)剩下80分鐘全部留給編程題。實(shí)際執(zhí)行時(shí)稍微超了一點(diǎn)用了45分鐘。原因是今年的選擇題里有一道操作系統(tǒng)相關(guān)的題涉及內(nèi)存分頁(yè)和頁(yè)表項(xiàng)大小計(jì)算我自己對(duì)這部分不夠熟來(lái)回算了兩遍。我當(dāng)時(shí)的策略是單選快速過(guò)遇到不確定的先用排除法選一個(gè)標(biāo)記一下多選保守處理只選有把握的選項(xiàng)。多選的分值通常較高少選還可能拿部分分但錯(cuò)選直接零蛋所以不建議在多選上賭。比如有道題問(wèn)“哪些協(xié)議屬于應(yīng)用層”我確定了HTTP和DNSSMTP也確定但不太確定TFTP我就只選了三個(gè)很確定的寧可少拿一分也不冒險(xiǎn)。2.2 記憶中的幾道關(guān)鍵選擇題與答案解析這里復(fù)盤三道我印象最深的題也串一下背后的考點(diǎn)。第一道是TCP擁塞控制。題目給了兩個(gè)TCP連接問(wèn)某一時(shí)刻擁塞窗口大小的變化涉及到慢啟動(dòng)、擁塞避免、快速重傳、快速恢復(fù)四個(gè)階段的切換條件。這道題本身不難但選項(xiàng)里埋了一個(gè)陷阱慢啟動(dòng)變成擁塞避免的閾值在快速恢復(fù)之后會(huì)被設(shè)置為當(dāng)前擁塞窗口的一半很多同學(xué)會(huì)把這個(gè)閾值變動(dòng)記錯(cuò)。我的經(jīng)驗(yàn)是把TCP擁塞控制理解為“先翻倍再線性加遇超時(shí)重置遇三個(gè)ACK減半”的十六字口訣再通過(guò)畫時(shí)間線圖來(lái)解。第二道是C虛函數(shù)表的布局。題目描述了一個(gè)基類和派生類的繼承結(jié)構(gòu)各有虛函數(shù)和普通成員變量問(wèn)對(duì)象內(nèi)存布局中虛函數(shù)指針放在哪里、派生類新增虛函數(shù)怎么填充。這道題我在復(fù)習(xí)時(shí)專門整理過(guò)多繼承下虛函數(shù)表的排列規(guī)則所以答得比較快。核心結(jié)論是單繼承下對(duì)象頭部放一個(gè)虛表指針指向虛函數(shù)表多繼承下每一條繼承鏈都對(duì)應(yīng)一個(gè)虛表指針新增虛函數(shù)追加到第一條繼承鏈的虛函數(shù)表末尾。我后來(lái)在面試中還遇到過(guò)類似問(wèn)題確認(rèn)這塊是非常重要的內(nèi)存布局基礎(chǔ)。第三道是一道“偽”算法題考LRU緩存。它沒有直接問(wèn)LRU實(shí)現(xiàn)而是給了一個(gè)基于數(shù)組時(shí)間戳的LRU近似實(shí)現(xiàn)問(wèn)某次訪問(wèn)后緩存里的元素順序。這道題很多人看到LRU就默認(rèn)用哈希表雙向鏈表反而忽視了題目里給定的具體數(shù)據(jù)結(jié)構(gòu)。我在這里停頓了大概三分鐘最后老老實(shí)實(shí)按其時(shí)間戳規(guī)則一步步模擬。應(yīng)對(duì)技巧是看到“XX算法”的題優(yōu)先回到題目的字面實(shí)現(xiàn)而不是條件反射套經(jīng)典解法。2.3 一道讓我猶豫很久的模擬題這類選擇題最考驗(yàn)臨場(chǎng)思路。題目大意是一個(gè)3級(jí)頁(yè)表系統(tǒng)頁(yè)大小4KB頁(yè)表項(xiàng)4字節(jié)進(jìn)程虛擬地址空間大小4GB物理內(nèi)存1GB問(wèn)這個(gè)進(jìn)程頁(yè)表總共占多少內(nèi)存選項(xiàng)是從幾MB到幾十MB的差別。我計(jì)算邏輯是虛擬地址4GB按4KB頁(yè)劃分共1M個(gè)頁(yè)。頁(yè)表項(xiàng)需要4字節(jié)一級(jí)頁(yè)表可索引1K個(gè)頁(yè)表項(xiàng)所以一級(jí)頁(yè)表有1K個(gè)頁(yè)表項(xiàng)對(duì)應(yīng)二級(jí)頁(yè)表有1K個(gè)三級(jí)頁(yè)表有1M個(gè)。頁(yè)表總項(xiàng)數(shù)大約是1M頁(yè)表項(xiàng) 1K二級(jí)頁(yè)表 1K一級(jí)頁(yè)表不對(duì)準(zhǔn)確說(shuō)如果是多級(jí)頁(yè)表每一級(jí)頁(yè)表大小是4KB共有1K1K1M個(gè)頁(yè)表項(xiàng)這樣算完大概4MB多。但選項(xiàng)里有個(gè)接近但不同的數(shù)值我一開始沒看內(nèi)存對(duì)齊。后面我重新梳理了一遍3級(jí)頁(yè)表頁(yè)大小4KB地址空間4GB則虛擬地址劃分成10位10位12位頁(yè)表一級(jí)和二級(jí)各有1K項(xiàng)三級(jí)有1M項(xiàng)。頁(yè)表項(xiàng)大小是4字節(jié)三級(jí)頁(yè)表總大小是1M×4字節(jié)4MB二級(jí)頁(yè)表總大小是1K×4字節(jié)×1K個(gè)二級(jí)頁(yè)表4MB一級(jí)頁(yè)表是4KB×1K個(gè)一級(jí)頁(yè)表其實(shí)還需要考慮每個(gè)進(jìn)程只映射一部分物理內(nèi)存。我最后選了一個(gè)我認(rèn)為合理的但說(shuō)實(shí)話這題消耗了我比較多時(shí)間也暴露了我對(duì)多級(jí)頁(yè)表深層計(jì)算不夠熟練。如果提前把《深入理解計(jì)算機(jī)系統(tǒng)》里虛擬內(nèi)存章節(jié)的例題刷一遍會(huì)從容很多。3. 三道編程題從題目難度梯度到細(xì)節(jié)陷阱編程題部分基本上決定了你能不能進(jìn)面試因?yàn)檫x擇題大家差距不大但編程題AC的題數(shù)會(huì)拉開檔次。我這次三題AC了前兩題第三題只過(guò)了部分用例最后拿到了面試資格。下面按我實(shí)操順序講。3.1 第一題字符串重排簽到題也有邊界坑題目大意為給定一個(gè)由小寫字母組成的字符串和一個(gè)整數(shù)k要求重排字符串使得任意兩個(gè)相同字符之間的距離至少為k。如果無(wú)法完成輸出空串或某個(gè)約定值。這和LeetCode 358“K距離間隔重排字符串”幾乎是同一道題屬于典型的貪心優(yōu)先隊(duì)列。我當(dāng)時(shí)的思路是統(tǒng)計(jì)每個(gè)字符出現(xiàn)次數(shù)用大頂堆維護(hù)出現(xiàn)次數(shù)字符對(duì)。每次從堆中取出出現(xiàn)次數(shù)最多的字符放入結(jié)果并把它暫存起來(lái)等距離滿足k之后再重新放回堆中。如果堆為空但結(jié)果長(zhǎng)度還不夠說(shuō)明無(wú)法完成。核心代碼框架#include bits/stdc.h using namespace std; string rearrange(string s, int k) { if (k 1) return s; unordered_mapchar, int cnt; for (char c : s) cnt[c]; priority_queuepairint, char pq; for (auto [ch, num] : cnt) pq.push({num, ch}); string res; queuepairint, char wait; while (!pq.empty()) { auto [num, ch] pq.top(); pq.pop(); res.push_back(ch); wait.push({num - 1, ch}); if ((int)wait.size() k) { auto [n, c] wait.front(); wait.pop(); if (n 0) pq.push({n, c}); } } return (int)res.size() (int)s.size() ? res : ; }這題我調(diào)試了大概8分鐘主要坑在于wait.size() k不是 k因?yàn)榕抨?duì)隊(duì)列里可能長(zhǎng)度超過(guò)k。另外如果字符串里某個(gè)字符重復(fù)次數(shù)特別大而且k非常大隊(duì)列永遠(yuǎn)推不回堆里最后結(jié)果長(zhǎng)度必然小于原字符串長(zhǎng)度直接返回空串。這個(gè)邊界判斷非常關(guān)鍵我第一次提交時(shí)只判斷了堆空沒有在最后比對(duì)長(zhǎng)度導(dǎo)致一個(gè)測(cè)試用例不過(guò)。補(bǔ)上res.size() s.size()的校驗(yàn)后AC。3.2 第二題動(dòng)態(tài)規(guī)劃狀態(tài)設(shè)計(jì)差點(diǎn)想歪第二題是一道典型的線性DP大意是給定一個(gè)數(shù)組每次可以移除一個(gè)元素得分為該元素乘以其左右相鄰元素的積如果相鄰元素被移除則跳過(guò)問(wèn)移除到剩下兩個(gè)元素時(shí)最大得分。這個(gè)題是“移除盒子”的減化版本也可以用區(qū)間DP做。我一開始想的貪心是每次移除得分最小的元素。試了一組數(shù)據(jù)發(fā)現(xiàn)不對(duì)比如數(shù)組[3, 1, 5, 8]貪心移除1得分1×3×515再移除3得分3×5×8120再移除5得分5×8總和很大但最優(yōu)解并不一定是這個(gè)順序。之后我轉(zhuǎn)向區(qū)間DP定義dp[i][j]為區(qū)間(i, j)內(nèi)元素全部移除后的最大得分當(dāng)然最后還要考慮邊界情況。轉(zhuǎn)移方程參考“戳氣球”的思路枚舉區(qū)間內(nèi)最后一個(gè)被移除的元素kdp[i][j] max(dp[i][j], dp[i][k] dp[k][j] nums[i]*nums[k]*nums[j])其中nums[i]和nums[j]是區(qū)間兩端保留的元素。這題和LeetCode 312“戳氣球”高度相似只是邊界條件不同所以其實(shí)并不算難但狀態(tài)設(shè)計(jì)如果一開始沒往區(qū)間DP方向想很容易卡住。我提交后有一組測(cè)試點(diǎn)超時(shí)發(fā)現(xiàn)是區(qū)間長(zhǎng)度從小到大的循環(huán)寫成從大到小導(dǎo)致大量重復(fù)計(jì)算。調(diào)換循環(huán)順序后順利通過(guò)。這里也驗(yàn)證了一個(gè)經(jīng)驗(yàn)DP題如果狀態(tài)定義正確但出現(xiàn)超時(shí)先檢查循環(huán)順序是不是從底向上。3.3 第三題圖論狀態(tài)壓縮部分分策略是明智的選擇第三題明顯是壓軸題題目是一個(gè)帶權(quán)無(wú)向圖每個(gè)節(jié)點(diǎn)有顏色比如紅藍(lán)綠要求找到一條從起點(diǎn)到終點(diǎn)的路徑使得路徑上每種顏色至少出現(xiàn)一次且路徑總權(quán)重最小。這題不要求經(jīng)過(guò)所有節(jié)點(diǎn)但要求顏色覆蓋。我一看數(shù)據(jù)范圍節(jié)點(diǎn)數(shù)n≤1e5邊數(shù)m≤2e5顏色種類≤3就知道這題不能裸跑BFS狀態(tài)壓縮。正確的打開方式應(yīng)該是從起點(diǎn)和終點(diǎn)分別跑一次單源最短路Dijkstra記錄每個(gè)點(diǎn)到達(dá)起點(diǎn)、到達(dá)終點(diǎn)時(shí)攜帶的顏色集合狀態(tài)然后枚舉中間點(diǎn)合并兩邊狀態(tài)如果合并后顏色全集為所需集合則更新答案。復(fù)雜度O((nm)logn * 2^k)k是顏色種類這里k3可行。但我當(dāng)時(shí)犯了兩個(gè)錯(cuò)誤一是把Dijkstra的距離數(shù)組定義成了二維dist[node][colorMask]沒有意識(shí)到其實(shí)只需要兩個(gè)一維數(shù)組加狀態(tài)枚舉二是用了鄰接矩陣而不是鄰接表導(dǎo)致內(nèi)存直接爆掉。等我想明白優(yōu)化方案時(shí)時(shí)間只剩下20分鐘我果斷選擇寫一個(gè)帶狀態(tài)壓縮的BFS暴力版本先跑通小數(shù)據(jù)拿部分分并確認(rèn)算法思路在題目給定的小樣例上正確。最終結(jié)果暴力版本過(guò)了約60%的測(cè)試點(diǎn)拿到了一個(gè)還可以的分?jǐn)?shù)。這個(gè)選擇我認(rèn)為是明智的。大廠筆試編程題不一定要求全AC很多時(shí)候兩題半就能進(jìn)面關(guān)鍵是不要在第三題上死磕導(dǎo)致沒有時(shí)間檢查前面交上去的代碼是否有低級(jí)錯(cuò)誤。我當(dāng)時(shí)的策略是先提交一版能跑出正確答案但可能超時(shí)的代碼保住正確性分?jǐn)?shù)再嘗試優(yōu)化沒時(shí)間優(yōu)化就算了。4. 騰訊音樂研發(fā)崗筆試的知識(shí)點(diǎn)橫向串聯(lián)4.1 算法不是只刷LeetCode就能過(guò)很多同學(xué)背題式刷LeetCode看到題目類型眼熟就以為自己會(huì)了。但大廠筆試的算法題往往會(huì)在經(jīng)典題上做一層業(yè)務(wù)包裝比如第一題的“K距離間隔重排”直接就是LeetCode原題變體第二題是“戳氣球”的換皮第三題則是把最短路徑和狀態(tài)壓縮結(jié)合。只靠背題是不行的你需要理解底層算法的推導(dǎo)過(guò)程。我建議準(zhǔn)備時(shí)把LeetCode上經(jīng)典題按類型整理成思維導(dǎo)圖滑動(dòng)窗口、雙指針、單調(diào)棧、區(qū)間DP、狀態(tài)壓縮DP、圖論最短路、最小生成樹、拓?fù)渑判虻?。每個(gè)類型至少精做3~5題而且每題都要能默寫核心代碼而不是看一遍題解就過(guò)。另外騰訊系筆試特別愛考“環(huán)狀數(shù)組”“字符串約簡(jiǎn)”“區(qū)間覆蓋”這類能體現(xiàn)思維靈活度的題。這些題本身算法難度不高但細(xì)節(jié)多返回值要求多容易在邊界條件翻車。平時(shí)練習(xí)時(shí)一定要自己構(gòu)造幾組極端數(shù)據(jù)空數(shù)組、全相等、單元素、負(fù)數(shù)、溢出把這些測(cè)試用例跑通再提交。4.2 C/Java語(yǔ)言細(xì)節(jié)編譯型崗位和JVM崗位的考察差異研發(fā)崗筆試的選擇題里語(yǔ)言相關(guān)題目占比不低具體考哪門取決于你投遞的崗位語(yǔ)言棧。C崗位會(huì)考虛函數(shù)、內(nèi)存對(duì)齊、智能指針、移動(dòng)語(yǔ)義、模板特化Java崗位會(huì)考JVM內(nèi)存分區(qū)、垃圾收集器、HashMap底層原理、并發(fā)工具類等。騰訊音樂的后臺(tái)開發(fā)可C可Java我投的偏C方向所以重點(diǎn)復(fù)習(xí)了C11/14/17的新特性。我印象深刻的一道題是考shared_ptr的線程安全性。題目問(wèn)多個(gè)線程同時(shí)拷貝同一個(gè)shared_ptr對(duì)象是否線程安全答案是引用計(jì)數(shù)本身是原子操作所以拷貝是安全的但多個(gè)線程同時(shí)修改同一個(gè)shared_ptr比如賦值重置則不安全需要額外加鎖。這個(gè)點(diǎn)非常容易被誤判因?yàn)樵贘ava語(yǔ)境下大家習(xí)慣說(shuō)HashMap線程不安全但C智能指針的線程安全邊界比較微妙面試官特別喜歡拿這種邊界題來(lái)篩人。如果你還有時(shí)間我建議把Effective Modern C里關(guān)于智能指針、移動(dòng)語(yǔ)義、lambda捕獲的條款過(guò)一遍再結(jié)合《深入理解計(jì)算機(jī)系統(tǒng)》第3章程序機(jī)器級(jí)表示來(lái)理解內(nèi)存布局因?yàn)檫@兩塊內(nèi)容在筆試、面試中反復(fù)出現(xiàn)。4.3 網(wǎng)絡(luò)、操作系統(tǒng)、數(shù)據(jù)庫(kù)筆試小題背后的工程價(jià)值選擇題里的網(wǎng)絡(luò)和操作系統(tǒng)題表面上看是筆試過(guò)場(chǎng)實(shí)際上它們?cè)诤罄m(xù)面試中會(huì)被深挖成項(xiàng)目場(chǎng)景題。比如TCP擁塞控制那道題如果你只是記住了四個(gè)階段的名字面試官會(huì)繼續(xù)問(wèn)“如果網(wǎng)絡(luò)出現(xiàn)頻繁超時(shí)你會(huì)如何調(diào)整擁塞窗口”再比如Lru緩存題面試官會(huì)順著問(wèn)“如果并發(fā)訪問(wèn)很高LRU如何加鎖有沒有鎖粒度更小的實(shí)現(xiàn)”我的經(jīng)驗(yàn)是復(fù)習(xí)選擇題時(shí)不要只記結(jié)論要把每個(gè)結(jié)論還原成場(chǎng)景。TCP為什么需要慢啟動(dòng)因?yàn)閯偨⑦B接時(shí)并不知道網(wǎng)絡(luò)可用帶寬有多大貿(mào)然發(fā)送大量數(shù)據(jù)可能會(huì)造成網(wǎng)絡(luò)擁塞。LRU為什么用哈希表雙向鏈表因?yàn)樾枰狾(1)時(shí)間完成查找和刪除數(shù)組時(shí)間戳的樸素實(shí)現(xiàn)雖然查得快但刪除和插入效率太低。數(shù)據(jù)庫(kù)方面騰訊音樂的業(yè)務(wù)場(chǎng)景是排行榜、歌單、用戶關(guān)注關(guān)系這些涉及大量讀多寫少的高QPS查詢所以索引設(shè)計(jì)、B樹結(jié)構(gòu)、覆蓋索引、分庫(kù)分表是高頻考點(diǎn)。選擇題如果考“什么情況下索引會(huì)失效”至少要能舉出四五個(gè)例子左模糊查詢、對(duì)索引列使用函數(shù)、隱式類型轉(zhuǎn)換、聯(lián)合索引不滿足最左前綴原則等。5. 筆試之后的復(fù)盤哪些分本可以不丟5.1 賽碼網(wǎng)特有的雷我?guī)湍悴冗^(guò)了賽碼網(wǎng)這個(gè)平臺(tái)如果你之前沒在上面練過(guò)有四個(gè)雷必須提前排除。第一它不自動(dòng)保存代碼。如果頁(yè)面意外刷新你寫了40分鐘的代碼可能直接消失所以養(yǎng)成“寫一段就手動(dòng)復(fù)制到本地記事本”的習(xí)慣。我筆試時(shí)雖然沒遇到掉線但聽說(shuō)同批有人因?yàn)榍谐鲰?yè)面太久被判作弊或者代碼丟失非常狼狽。第二輸入輸出模板要提前準(zhǔn)備。賽碼網(wǎng)很多題是ACM風(fēng)格需要你處理多行輸入甚至輸入里第一行是測(cè)試用例數(shù)T后面跟著T組數(shù)據(jù)。如果不知道自己寫的是while (cin n)還是for (int i0; iT; i)很容易在本地跑通但提交后0分。第三編譯器版本選擇和本地不太一致。賽碼網(wǎng)C默認(rèn)支持C17但有些老的OJ模板只支持C11。如果你用了結(jié)構(gòu)化綁定或者auto返回值推導(dǎo)等新特性可能導(dǎo)致編譯失敗。提交前先確認(rèn)語(yǔ)言版本或者干脆用C11的保守寫法。第四內(nèi)存超限的提示不直觀。如果你動(dòng)態(tài)申請(qǐng)了超大數(shù)組賽碼網(wǎng)可能會(huì)顯示“答案錯(cuò)誤”而不是“內(nèi)存超限”導(dǎo)致你誤以為算法本身有問(wèn)題反復(fù)改邏輯浪費(fèi)時(shí)間。遇到大數(shù)組時(shí)先估算內(nèi)存占用是否超過(guò)限制再考慮算法優(yōu)化。5.2 時(shí)間分配的量化模型筆試復(fù)盤后我總結(jié)了一套“120分鐘通用分配模型”后續(xù)在京東、美團(tuán)、拼多多的筆試?yán)镆灿昧梭w感不錯(cuò)。前10分鐘快速瀏覽全部題目不急著動(dòng)筆。用這三道題把你腦內(nèi)的題單過(guò)一遍這是見過(guò)的題型還是沒見過(guò)的新題型如果見過(guò)直接回憶算法模板如果沒見過(guò)先跳過(guò)做下一題。40分鐘做選擇題平均每題2分鐘超過(guò)3分鐘的先標(biāo)記跳過(guò)。多選不要貪只選確定項(xiàng)。55分鐘做編程題前兩題每道題最多25分鐘包括讀題、思考、編碼、自測(cè)。15分鐘做第三題。如果前兩題還沒AC先保第一題不要戀戰(zhàn)。最后10分鐘檢查已經(jīng)提交的代碼是否有多余調(diào)試輸出、輸入格式是否有問(wèn)題、是否忘了return 0。這個(gè)模型的邏輯是編程題前兩題的分值比第三題高而第三題往往是給少數(shù)人準(zhǔn)備的區(qū)分題。目標(biāo)不是滿分而是穩(wěn)定拿到前80%的分?jǐn)?shù)。5.3 后續(xù)面試銜接筆試題目如何成為面試素材大廠面試經(jīng)常會(huì)圍繞你的筆試答題記錄提問(wèn)尤其是你沒AC的那道題。面試官不會(huì)因?yàn)槟銢]做出來(lái)就掛你反而會(huì)想看看你的思路完整度和臨場(chǎng)反應(yīng)。所以筆試結(jié)束后我立刻把三題重新做了一遍整理成筆記包含題目描述、我的原始思路、錯(cuò)誤卡點(diǎn)、標(biāo)準(zhǔn)解法和復(fù)雜度分析。后面一面時(shí)面試官確實(shí)問(wèn)到了第三題“你筆試時(shí)第三題只過(guò)了部分用例現(xiàn)在能講講思路嗎”因?yàn)槲矣鞋F(xiàn)成整理整個(gè)回答行云流水這一輪印象分直接拉滿。這個(gè)整理文檔建議用Markdown或Notion保存每道題包含以下部分題目類型和知識(shí)點(diǎn)標(biāo)簽輸入輸出格式原始解題思路和為什么不對(duì)正確思路和復(fù)雜度手寫的邊界測(cè)試用例不要忽略這個(gè)環(huán)節(jié)它可能決定你從“筆試通過(guò)”到“面試通過(guò)”的那一步。6. 一些額外的話筆試只是秋招長(zhǎng)跑中的一站過(guò)了自然開心沒過(guò)大不了再投下一家。但復(fù)盤一次筆試比盲目刷十道新題更有價(jià)值。我在這次騰訊音樂筆試?yán)镎嬲龑W(xué)到的東西不是某道題的解法而是如何管理90分鐘內(nèi)的緊張感、如何在完全陌生的OJ環(huán)境下穩(wěn)定輸出、如何在拿到三道難題時(shí)快速判斷放棄哪一道。這些能力在后來(lái)的拼多多筆試和美團(tuán)面試?yán)锒寂缮狭擞脠?chǎng)。如果你現(xiàn)在正處于秋招準(zhǔn)備期我的建議是每周抽一天做整套的全真模擬平臺(tái)就用賽碼網(wǎng)或??推髽I(yè)題庫(kù)掐表、全程不切瀏覽器、不翻筆記模擬到能穩(wěn)定輸出為止。等上了真正的考場(chǎng)你會(huì)發(fā)現(xiàn)最難的往往不是題目本身而是如何在有限時(shí)間內(nèi)把自己會(huì)的內(nèi)容全部轉(zhuǎn)化成分?jǐn)?shù)。