易2023校招算法工程師筆試復(fù)盤:題型拆解與備考策略)
又到了校招季正好有不少人私信問我去年網(wǎng)易2023校招算法工程師的筆試情況。我參加的正是正式批第一批這套題做下來(lái)最大的感受是編程題不算偏但選擇題范圍寬而且時(shí)間卡得很緊。從投遞簡(jiǎn)歷到筆試再到最終拿到意向書這條路我完整走了一遍所以想把這次筆試復(fù)盤和經(jīng)驗(yàn)整理出來(lái)。這篇東西不只在講某一道題的解法更想說(shuō)明白校招筆試這套篩選邏輯是什么、算法工程師崗位在筆試?yán)锏降卓际裁础⒁约翱记白詈髱滋鞈?yīng)該怎么準(zhǔn)備。無(wú)論你是正在準(zhǔn)備秋招的應(yīng)屆生還是打算往算法方向轉(zhuǎn)的同學(xué)按這個(gè)思路去準(zhǔn)備至少不會(huì)在筆試環(huán)節(jié)吃大虧。1. 先把筆試這件事看透網(wǎng)易校招筆試的結(jié)構(gòu)與隱藏邏輯1.1 題型結(jié)構(gòu)選擇題和編程題分別篩選什么網(wǎng)易校招筆試一般安排在線上平臺(tái)限時(shí)完成整套卷子由選擇題和編程題兩部分組成。選擇題范圍覆蓋數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)這些計(jì)算機(jī)基礎(chǔ)算法崗還會(huì)額外摻入一些概率統(tǒng)計(jì)、機(jī)器學(xué)習(xí)基礎(chǔ)題。編程題通常在2到3道之間占分最大基本決定你能不能進(jìn)入后續(xù)面試。很多人會(huì)有一個(gè)誤區(qū)算法工程師崗筆試最重要的是刷LeetCode選擇題隨便準(zhǔn)備就行。我第一年也是這么想的結(jié)果差點(diǎn)在選擇題上翻車。校招選擇題考察的是“你大學(xué)四年到底學(xué)沒學(xué)過(guò)計(jì)算機(jī)基礎(chǔ)”編程題考察的是“給定一個(gè)明確問題你能不能快速寫好代碼”。兩者篩選維度不同但權(quán)重都很高。我復(fù)盤了一下網(wǎng)易這套筆試題選擇題里數(shù)據(jù)結(jié)構(gòu)考察得很細(xì)比如鏈表的邊界操作、二叉樹的遍歷方式、哈希沖突的處理策略都是老生常談但特別容易混淆的知識(shí)點(diǎn)。操作系統(tǒng)則偏好進(jìn)程線程區(qū)別、死鎖條件、虛擬內(nèi)存計(jì)算機(jī)網(wǎng)絡(luò)則經(jīng)常問TCP三次握手、擁塞控制、HTTP狀態(tài)碼。算法崗特有的概率題通常是貝葉斯公式、期望計(jì)算這種雖然不難但如果你很久沒碰數(shù)學(xué)現(xiàn)場(chǎng)容易發(fā)懵。1.2 崗位差異算法工程師筆試和后臺(tái)開發(fā)筆試不是一回事同樣是筆試后臺(tái)開發(fā)崗和算法崗的側(cè)重點(diǎn)有明顯差異。后臺(tái)開發(fā)更偏重工程能力編程題里會(huì)出現(xiàn)系統(tǒng)設(shè)計(jì)、并發(fā)處理、大數(shù)據(jù)量排序之類的場(chǎng)景算法崗的編程題更偏重?cái)?shù)據(jù)結(jié)構(gòu)與算法的基本功題目本身不涉及復(fù)雜業(yè)務(wù)但要求你能快速識(shí)別出題目背后是哪種算法模型。與此同時(shí)算法崗筆試的選擇題會(huì)多出一塊“機(jī)器學(xué)習(xí)基礎(chǔ)”內(nèi)容。比如損失函數(shù)的選擇、過(guò)擬合的處理手段、常見分類模型的適用場(chǎng)景。這些知識(shí)點(diǎn)不需要你手推公式但你要懂核心思想。我在準(zhǔn)備階段復(fù)盤了近兩年網(wǎng)易和其他大廠的算法崗筆試題發(fā)現(xiàn)一個(gè)規(guī)律它們對(duì)深度學(xué)習(xí)框架、具體模型結(jié)構(gòu)的考察極少更多考察的是傳統(tǒng)機(jī)器學(xué)習(xí)算法和數(shù)學(xué)基礎(chǔ)。原因很簡(jiǎn)單校招同學(xué)在校項(xiàng)目里用框架寫得天花亂墜但很多人連“交叉熵為什么能衡量分布差異”都答不上來(lái)筆試就是用來(lái)篩掉這種基礎(chǔ)不牢的簡(jiǎn)歷。1.3 為什么大廠偏愛限時(shí)編程題有人會(huì)問為什么明明有簡(jiǎn)歷篩選還要用一套硬核的限時(shí)編程題來(lái)篩人我的理解是這樣的編程題可以在最短時(shí)間內(nèi)橫向比較大量候選人的代碼能力而且?guī)缀鯚o(wú)法作弊。簡(jiǎn)歷可以包裝項(xiàng)目可以注水但讓你限時(shí)在白板/網(wǎng)頁(yè)編輯器里從零寫一個(gè)函數(shù)幾斤幾兩一試便知。更重要的是限時(shí)編程題模擬的是真實(shí)工作場(chǎng)景。一位算法工程師日常并不只是調(diào)參訓(xùn)模型大量時(shí)間花在數(shù)據(jù)清洗、特征工程、評(píng)估腳本和模型服務(wù)化上這些都要求扎實(shí)的編碼功底。我在筆試過(guò)程中深刻的體會(huì)是限時(shí)兩小時(shí)看起來(lái)充裕實(shí)際上三道編程題加二十幾道選擇題平均每道題的時(shí)間也就幾分鐘一旦某道題卡住整場(chǎng)節(jié)奏都會(huì)被拖垮。所以平時(shí)練習(xí)必須卡時(shí)間不能泡在IDE里慢慢磨。2. 高頻算法考點(diǎn)拆解字符串、圖論、動(dòng)態(tài)規(guī)劃一個(gè)都不能放過(guò)2.1 字符串系KMP的next數(shù)組到底怎么算字符串題在算法工程師筆試?yán)锍霈F(xiàn)的概率極高尤其KMP算法幾乎成了必考題。網(wǎng)上總有傳言說(shuō)KMP“面試不考、工作不用”但校招筆試就是喜歡考因?yàn)樗巧儆械募饶芸疾臁白址ヅ渌季S”又能在短代碼里體現(xiàn)算法精髓的知識(shí)點(diǎn)。先明確一下next數(shù)組的定義不同教材定義不同這里采用一種最常見的next[i]表示模式串p[0..i-1]這個(gè)子串的最長(zhǎng)相等前后綴長(zhǎng)度。也就是說(shuō)對(duì)于每個(gè)位置i我們要算的是它前面那段字符里前綴和后綴最多能重合多長(zhǎng)。計(jì)算邏輯可以用一個(gè)遞推過(guò)程def build_next(p): m len(p) nxt [0] * m j 0 for i in range(1, m): while j 0 and p[i] ! p[j]: j nxt[j - 1] if p[i] p[j]: j 1 nxt[i] j return nxt網(wǎng)上熱詞里有一道典型題對(duì)模式串 p abacaba求其next數(shù)組。我們用手算來(lái)一遍。i1子串是a最長(zhǎng)相等前后綴長(zhǎng)度為0i2子串是ab前綴a和后綴b不相等為0i3子串是aba前綴a等于后綴a長(zhǎng)度為1i4子串是abac前綴a與后綴c不匹配前綴ab與ac也不匹配為0i5子串是abaca前綴a等于后綴a長(zhǎng)度1i6子串是abacab前綴ab等于后綴ab長(zhǎng)度2i7子串是abacaba前綴aba等于后綴aba長(zhǎng)度3。所以next數(shù)組是 [0,0,0,1,0,1,2,3]如果按next[0]0length7則數(shù)組長(zhǎng)度是7還是8取決于下標(biāo)定義要看題目要求。這道看起來(lái)簡(jiǎn)單的題實(shí)際錯(cuò)誤率很高因?yàn)榇蠹胰菀自趇4和i5處算錯(cuò)。這里想特別強(qiáng)調(diào)一件事手算next數(shù)組時(shí)不要跳步每一步都要把“當(dāng)前子串的所有前綴和后綴列出來(lái)再比較”做一遍等熟練之后再在心里速算。筆試?yán)锶绻龅終MP變體最穩(wěn)妥的辦法是直接寫出上面這個(gè)build_next函數(shù)再根據(jù)題目要求做匹配而不是在草稿紙上手推一套專用邏輯。2.2 圖論系Dijkstra與BFS/DFS的混合題型圖論題在校招筆試?yán)锍鲧R率也很高網(wǎng)易尤其愛出最短路徑相關(guān)的題目。??嫉奶卣魇恰敖o定一個(gè)n個(gè)節(jié)點(diǎn)m條邊的無(wú)向帶權(quán)圖求從起點(diǎn)到終點(diǎn)的最短路徑”。這種題最直接的解法就是Dijkstra算法但必須用堆優(yōu)化版本否則在n達(dá)到10的5次方級(jí)別時(shí)會(huì)超時(shí)。堆優(yōu)化Dijkstra的核心思想是用優(yōu)先隊(duì)列維護(hù)當(dāng)前未確定最短路的節(jié)點(diǎn)中距離最小的節(jié)點(diǎn)每次取出隊(duì)首節(jié)點(diǎn)并松弛其鄰邊如果某條邊能產(chǎn)生更短距離就更新并推入隊(duì)列。給你一份可以直接抄的模板import heapq def dijkstra(n, edges, start): graph [[] for _ in range(n)] for u, v, w in edges: graph[u].append((v, w)) graph[v].append((u, w)) dist [float(inf)] * n dist[start] 0 pq [(0, start)] while pq: d, u heapq.heappop(pq) if d dist[u]: continue for v, w in graph[u]: nd d w if nd dist[v]: dist[v] nd heapq.heappush(pq, (nd, v)) return dist這個(gè)模板我筆試時(shí)直接默寫出來(lái)節(jié)省了大量時(shí)間。不過(guò)要注意Dijkstra只適用于邊權(quán)非負(fù)的圖。如果題目中的邊權(quán)全部為1那根本不用Dijkstra直接BFS就能求最短路時(shí)間復(fù)雜度還更低。有同學(xué)看到“最短路”三個(gè)字就條件反射寫Dijkstra反而把簡(jiǎn)單問題復(fù)雜化。筆試題還有一個(gè)常見套路是把網(wǎng)格地圖轉(zhuǎn)換為圖來(lái)求解。比如“給定一個(gè)二維矩陣0代表空地1代表障礙求從左上角到右下角的最短步數(shù)”這就是典型的BFS。如果你能把圖論模板背熟并理解BFS、Dijkstra的適用邊界圖論題基本不會(huì)丟分。2.3 動(dòng)態(tài)規(guī)劃與貪心從“會(huì)背模板”到“會(huì)選狀態(tài)”動(dòng)態(tài)規(guī)劃和貪心是算法工程師筆試的分水嶺。簡(jiǎn)單題大家都會(huì)難題靠的就是狀態(tài)定義和轉(zhuǎn)移方程。網(wǎng)上熱詞里有大量關(guān)于排序、貪心、DP的內(nèi)容說(shuō)明這些知識(shí)點(diǎn)確實(shí)是校招刷題的高頻區(qū)。關(guān)于動(dòng)態(tài)規(guī)劃我建議準(zhǔn)備時(shí)抓住幾個(gè)高頻模型0-1背包、完全背包、最長(zhǎng)遞增子序列、最長(zhǎng)公共子序列、編輯距離、區(qū)間DP。每一類模型都要做到“能推導(dǎo)、能默寫、能變形”。比如0-1背包空間優(yōu)化為滾動(dòng)數(shù)組后內(nèi)層循環(huán)為什么要倒序遍歷這個(gè)原理必須清楚因?yàn)橐坏李}稍微變個(gè)條件比如要求恰好裝滿背包就需要你調(diào)整初始化和遍歷方向。貪心題目的難點(diǎn)在于證明貪心策略的正確性。筆試中很多貪心題看起來(lái)可以做但你沒證明就寫很容易掉進(jìn)反例的坑。我的經(jīng)驗(yàn)是如果一個(gè)題看起來(lái)能貪心先花兩分鐘試著構(gòu)造反例構(gòu)造不出來(lái)再用貪心思路寫代碼。如果構(gòu)造出了反例馬上轉(zhuǎn)DP或二分答案等其他思路。有一類典型案例是“會(huì)議室安排最多場(chǎng)次”的變體題貪心策略是按結(jié)束時(shí)間排序這背后的邏輯是每一步都選擇結(jié)束時(shí)間最早的會(huì)議為后續(xù)留下更多空間。這種證明必須掌握因?yàn)槊嬖嚬俸芸赡茼樦P試題目追問“為什么這樣貪心是對(duì)的”。3. 在線筆試的求生細(xì)節(jié)很多人在提交之前就輸了3.1 輸入輸出格式讀題多花30秒調(diào)試省半小時(shí)筆試平臺(tái)通常不是LeetCode那種已經(jīng)幫你封裝好函數(shù)的形式而是要求你從標(biāo)準(zhǔn)輸入讀數(shù)據(jù)再把結(jié)果打印到標(biāo)準(zhǔn)輸出。這意味著輸入輸出本身的處理就能卡住一批人。常見的有三種輸入場(chǎng)景第一種是單組測(cè)試直接讀固定格式的數(shù)據(jù)第二種是有T組測(cè)試每組做一遍同樣的邏輯第三種是不給你組數(shù)要求一直讀到文件末尾也就是EOF。這三種場(chǎng)景的讀法完全不同如果題目要求EOF結(jié)束而你只讀到第一組數(shù)據(jù)就會(huì)漏掉大量用例得到Wrong Answer。Python下可以用這種寫法來(lái)處理“若干組以EOF結(jié)束”的場(chǎng)景import sys for line in sys.stdin: n, m map(int, line.split()) solve(n, m)C則常用while (cin n m) { solve(n, m); }另外輸出格式也要注意有些題目要求每個(gè)結(jié)果之間用換行分隔有些要求最后一行也有換行。這些細(xì)節(jié)看起來(lái)不起眼但會(huì)導(dǎo)致Presentation Error。我筆試時(shí)習(xí)慣先看一遍樣例輸入輸出確認(rèn)格式后再動(dòng)筆寫邏輯這個(gè)習(xí)慣幫我避開了很多坑。3.2 復(fù)雜度估算拿到題先看數(shù)據(jù)范圍再定算法在線筆試和平時(shí)刷題有個(gè)很大的不同你沒法立刻知道數(shù)據(jù)范圍。題目描述里會(huì)給n、m的取值范圍這個(gè)信息極其關(guān)鍵直接決定了你該用哪種算法。我總結(jié)了一張自己常用的速查表數(shù)據(jù)規(guī)??山邮艿臅r(shí)間復(fù)雜度典型算法思路n 20O(2^n) 或 O(n!)狀態(tài)壓縮、暴力搜索n 100O(n^3)Floyd、三重循環(huán)、區(qū)間DPn 1000O(n^2)樸素DP、雙指針n 10^5O(n log n) 或 O(n)排序貪心、堆、線段樹、滑動(dòng)窗口n 10^9O(log n) 或 O(1)二分答案、矩陣快速冪、數(shù)學(xué)公式拿到題先看n的范圍再去想算法這個(gè)順序不能反。我見過(guò)太多人拿O(n^2)的去處理10^5量級(jí)的數(shù)據(jù)最后超時(shí)然后開始瘋狂優(yōu)化常數(shù)其實(shí)從一開始方向就錯(cuò)了。如果n是10^5而你想到了排序貪心的O(n log n)解法那這道題的思路基本就穩(wěn)了。3.3 邊界與防御寫一個(gè)會(huì)“挑刺”的自己筆試程序最惡心的錯(cuò)誤不是邏輯錯(cuò)而是邊界情況沒處理好??諗?shù)組、單元素?cái)?shù)組、全部元素相同、字符串首尾帶空格、坐標(biāo)越界、整型溢出、浮點(diǎn)數(shù)相等比較這些都是提交后才會(huì)暴露的坑。我的習(xí)慣是代碼寫完后不急著提交花兩分鐘構(gòu)造三組特殊用例——最小規(guī)模、最大規(guī)模、全是極端值。比如題目讓你求最長(zhǎng)遞增子序列我就測(cè)一下n1的情況如果題目涉及求和我就測(cè)一下全為最大值的用例檢查會(huì)不會(huì)爆int范圍。Python的int沒有溢出問題但C里int和long long的切換很容易出問題。筆試現(xiàn)場(chǎng)時(shí)間緊迫一旦你只顧著寫主流程而忽略邊界很可能交完才發(fā)現(xiàn)自己的程序在n1時(shí)直接報(bào)錯(cuò)。4. 現(xiàn)場(chǎng)還原三道有代表性的筆試編程題4.1 滑動(dòng)窗口求滿足條件的最短子串網(wǎng)易筆試題中有一類出現(xiàn)頻率特別高的滑窗題題目大致是這樣的給定一個(gè)字符串s和一個(gè)目標(biāo)字符串p求s中包含p所有字符的最短子串長(zhǎng)度。這道題的考點(diǎn)就是滑動(dòng)窗口它的思路比暴力要巧妙得多但代碼量也不大。實(shí)現(xiàn)思路用“需求表缺失計(jì)數(shù)”兩步走。先用哈希表記錄p中每個(gè)字符的需求量再用兩個(gè)指針left和right維護(hù)當(dāng)前窗口。right每擴(kuò)展一個(gè)字符如果該字符仍然“缺”就減少缺失計(jì)數(shù)當(dāng)缺失計(jì)數(shù)歸零說(shuō)明當(dāng)前窗口已經(jīng)覆蓋了p此時(shí)嘗試移動(dòng)left縮小窗口直到窗口不再滿足條件。整個(gè)過(guò)程中記錄最短窗口長(zhǎng)度即可。以下是參考代碼from collections import Counter def min_window(s, p): need Counter(p) missing len(p) left 0 res (float(inf), 0, 0) for right, ch in enumerate(s): if need[ch] 0: missing - 1 need[ch] - 1 if missing 0: while left right and need[s[left]] 0: need[s[left]] 1 left 1 if right - left 1 res[0]: res (right - left 1, left, right) need[s[left]] 1 missing 1 left 1 return if res[0] float(inf) else s[res[1]:res[2] 1]這個(gè)模板需要注意的是need中的計(jì)數(shù)會(huì)變成負(fù)數(shù)表示窗口內(nèi)該字符數(shù)量超出需求這是判斷左指針能否收縮的關(guān)鍵。筆試時(shí)如果時(shí)間緊可以直接套模板但建議你自己在本地多跑幾組用例驗(yàn)證一下因?yàn)椤按翱趦?nèi)字符超出需求”和“窗口仍有效”這兩者的邏輯關(guān)系非常容易寫錯(cuò)。4.2 堆優(yōu)化Dijkstra網(wǎng)絡(luò)最短時(shí)延問題還有一道比較典型的圖論題題目大概是給定一個(gè)包含n個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò)圖每一條邊都帶有傳輸時(shí)延現(xiàn)在從某個(gè)節(jié)點(diǎn)發(fā)出一條消息求消息廣播到所有節(jié)點(diǎn)所需的最短時(shí)間。這題的思路其實(shí)就是求從源節(jié)點(diǎn)出發(fā)到所有節(jié)點(diǎn)的最短路徑答案就是其中最長(zhǎng)的最短距離。我直接套用了前面給出的堆優(yōu)化Dijkstra模板然后取dist數(shù)組的最大值作為答案。寫起來(lái)大概只需要十分鐘。這道題之所以值得復(fù)盤是因?yàn)樗疾斓牟恢皇荄ijkstra本身還包括一個(gè)額外的轉(zhuǎn)化要求的是所有節(jié)點(diǎn)收到消息的時(shí)間不是某一個(gè)目標(biāo)節(jié)點(diǎn)所以答案等于最短路中的最大值。很多同學(xué)把Dijkstra寫出來(lái)以后卻忘了取max白白丟分。順帶一提如果這個(gè)題改成“是否存在節(jié)點(diǎn)無(wú)法收到消息”那還需要檢查dist數(shù)組中是否有節(jié)點(diǎn)仍是無(wú)窮大。這類邊角條件往往就是筆試的隱藏分寫的時(shí)候一定要多問自己一句題目里有沒有類似“全部節(jié)點(diǎn)可達(dá)嗎”的隱含要求。4.3 排序之后的區(qū)間合并思維題往往更考驗(yàn)代碼簡(jiǎn)潔度網(wǎng)易筆試編程題里也會(huì)出現(xiàn)一些看起來(lái)并不“算法”的題比如區(qū)間合并給定一系列區(qū)間合并所有重疊區(qū)間輸出合并后的區(qū)間個(gè)數(shù)或總長(zhǎng)度。題意很簡(jiǎn)單但代碼寫得干不干凈很考驗(yàn)基本功。解題步驟也很直接先把區(qū)間按左端點(diǎn)排序然后遍歷所有區(qū)間維護(hù)當(dāng)前合并后的右邊界。如果當(dāng)前區(qū)間左端點(diǎn)大于右邊界說(shuō)明無(wú)法合并把當(dāng)前區(qū)間收入結(jié)果否則更新右邊界為兩者中的較大值。參考代碼def merge(intervals): if not intervals: return [] intervals.sort(keylambda x: x[0]) res [] for l, r in intervals: if not res or l res[-1][1]: res.append([l, r]) else: res[-1][1] max(res[-1][1], r) return res這道題想提醒大家的是不是你只會(huì)高階算法就能拿高分能把簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)題寫得又快又準(zhǔn)往往才是筆試拿滿分的保障?,F(xiàn)場(chǎng)答題時(shí)最怕“想太多”區(qū)間合并一上來(lái)就腦補(bǔ)線段樹優(yōu)化結(jié)果不僅增加代碼量還可能因?yàn)閺?fù)雜度過(guò)高而寫錯(cuò)邊界反而不如基礎(chǔ)的排序加貪心。5. 算法工程師崗位的“隱藏考點(diǎn)”機(jī)器學(xué)習(xí)與大模型5.1 數(shù)學(xué)與機(jī)器學(xué)習(xí)基礎(chǔ)選擇題里藏著真功夫算法工程師筆試和普通開發(fā)崗筆試最大區(qū)別就是選擇題中會(huì)出現(xiàn)數(shù)學(xué)和機(jī)器學(xué)習(xí)內(nèi)容。網(wǎng)易這筆試也不例外。我記得選擇題里出現(xiàn)了貝葉斯公式求后驗(yàn)概率的題目還有一道關(guān)于交叉熵?fù)p失函數(shù)的選擇題選項(xiàng)分別是MSE、交叉熵、Hinge Loss等在不同場(chǎng)景下的表現(xiàn)。如果你只刷題不看機(jī)器學(xué)習(xí)基礎(chǔ)這兩道題基本沒法做。我建議大家準(zhǔn)備時(shí)重點(diǎn)復(fù)習(xí)幾個(gè)模塊概率論中的貝葉斯公式、期望與方差、常見分布機(jī)器學(xué)習(xí)中的偏差與方差、過(guò)擬合與正則化、常見損失函數(shù)、決策樹與隨機(jī)森林的差異、SVM的核函數(shù)思想。很多內(nèi)容不需要手動(dòng)推導(dǎo)公式但你要能理解“為什么用這個(gè)”而不是“怎么算這個(gè)”。此外有一類認(rèn)知題也常出現(xiàn)比如“當(dāng)訓(xùn)練集和測(cè)試集分布不一致時(shí)以下哪種處理方式最有效”。這種題沒有標(biāo)準(zhǔn)公式可以套考的是你對(duì)機(jī)器學(xué)習(xí)流程的整體理解。我的建議是遇到這種題不要憑記憶去猜而是從實(shí)際業(yè)務(wù)邏輯去推理。筆試出題人的邏輯其實(shí)很簡(jiǎn)單他們想看你是不是只會(huì)在Jupyter Notebook里跑模型。5.2 大模型時(shí)代算法工程師正在被提出新要求2023年這批校招一個(gè)明顯的信號(hào)是大模型相關(guān)內(nèi)容開始出現(xiàn)在算法工程師的考察范圍里。雖然網(wǎng)易筆試的編程題沒有直接讓你實(shí)現(xiàn)Transformer但選擇題里已經(jīng)出現(xiàn)了關(guān)于注意力機(jī)制、推理加速等方向的基礎(chǔ)問題。熱詞里有“AI算法工程師必知必會(huì) 入門llama.cpp”這其實(shí)反映了行業(yè)對(duì)算法工程師的新期待不僅要會(huì)訓(xùn)練模型還要懂推理部署和性能優(yōu)化。如果你正在準(zhǔn)備算法工程師校招我建議在大模型方向做三件事第一完全理解Transformer的self-attention機(jī)制知道Q、K、V從哪里來(lái)到哪里去第二了解常見的推理優(yōu)化手段比如量化、剪枝、蒸餾、KV Cache至少知道它們分別解決什么問題第三動(dòng)手跑通一個(gè)開源大模型的本地推理流程選一個(gè)輕量項(xiàng)目能夠講清楚從下載權(quán)重到調(diào)用推理接口的完整鏈路。哪怕筆試不直接考面試時(shí)也幾乎必問。6. 備考時(shí)間線與臨場(chǎng)策略我把自己的安排寫在這里6.1 提前三個(gè)月以刷題和基礎(chǔ)為主的儲(chǔ)備期校招筆試準(zhǔn)備不能靠考前一周突擊我的時(shí)間線是提前三個(gè)月開始。前兩個(gè)月主要做兩件事一是把數(shù)據(jù)結(jié)構(gòu)與算法的基礎(chǔ)知識(shí)系統(tǒng)過(guò)一遍包括數(shù)組、鏈表、棧、隊(duì)列、樹、圖、哈希表、排序、二分、動(dòng)態(tài)規(guī)劃、貪心二是每天固定刷2到3道LeetCode中等難度題優(yōu)先覆蓋高頻考點(diǎn)。我還做了一件事就是建立自己的“模板庫(kù)”。把KMP、Dijkstra、并查集、滑動(dòng)窗口、二分答案、線段樹等常用算法整理成可以直接復(fù)用的代碼片段并且每段都自己默寫過(guò)至少三遍。筆試時(shí)直接調(diào)用這些模板能節(jié)省大量時(shí)間。注意模板庫(kù)不是抄一遍就完事的你要能默寫出來(lái)因?yàn)楣P試平臺(tái)沒有你本地的代碼片段可復(fù)制。6.2 提前一個(gè)月真題、周賽和模擬環(huán)境最后一個(gè)月重心從“學(xué)”轉(zhuǎn)向“測(cè)”。我會(huì)每天做一場(chǎng)線上模擬筆試用牛客網(wǎng)或LeetCode周賽的限時(shí)模式練習(xí)要求自己兩小時(shí)內(nèi)完成所有題目嚴(yán)格模擬真實(shí)的考試節(jié)奏。這個(gè)過(guò)程非常痛苦但也非常有效。第一次模擬我甚至沒有做完第一道題但練到第五次時(shí)已經(jīng)能穩(wěn)定在三道題中提交兩道并保證正確率。模擬時(shí)要注意一個(gè)細(xì)節(jié)真實(shí)筆試的在線編輯器通常不帶自動(dòng)補(bǔ)全和語(yǔ)法檢查有些平臺(tái)連本地調(diào)試都不方便。所以我平時(shí)刷題時(shí)會(huì)特意在網(wǎng)頁(yè)編輯器中寫代碼不依賴IDE的提示這樣到了考場(chǎng)不會(huì)因?yàn)椤按a助手消失”而手忙腳亂。6.3 筆試當(dāng)天時(shí)間管理、環(huán)境檢查和心態(tài)筆試當(dāng)天我給自己定的策略是“先掃卷再動(dòng)手”。拿到卷子先不急著寫代碼用5分鐘瀏覽所有題目評(píng)估每一道題的難度。然后按“會(huì)做的先做不會(huì)做的標(biāo)記后做”的順序執(zhí)行。選擇題通常會(huì)先快速過(guò)一遍遇到卡殼的不糾結(jié)直接蒙一個(gè)并標(biāo)記等到最后有空余時(shí)間再回看。環(huán)境上也有幾個(gè)建議提前測(cè)試瀏覽器兼容性有些在線筆試平臺(tái)對(duì)瀏覽器有特殊要求關(guān)閉所有可能彈窗的軟件包括微信、郵件提醒避免考試過(guò)程中被切出頁(yè)面某些平臺(tái)會(huì)記錄切屏次數(shù)嚴(yán)重時(shí)直接判作弊。最后預(yù)留至少十分鐘檢查代碼里的print拼寫、輸入函數(shù)是否寫對(duì)、輸出格式是否和樣例一致。我見過(guò)不少同學(xué)算法思路完全正確卻因?yàn)閜rintf寫成了print而全盤得零分這種損失太不值得。結(jié)尾一點(diǎn)個(gè)人體會(huì)真正經(jīng)歷完整套流程后我最大的感受是校招筆試篩的從來(lái)不是“天才”而是“穩(wěn)的人”。算法題誰(shuí)都會(huì)說(shuō)思路但能在限時(shí)、沒有IDE輔助、精神高度緊張的情況下把代碼一次寫對(duì)、把邊界測(cè)全、把復(fù)雜度算清楚這才是企業(yè)真正需要的能力。我個(gè)人在準(zhǔn)備后期把大量時(shí)間從“刷新題”改成了“重復(fù)默寫模板和復(fù)盤錯(cuò)題”這個(gè)轉(zhuǎn)變讓我在筆試現(xiàn)場(chǎng)心里踏實(shí)了很多。最后再分享一個(gè)實(shí)用小技巧筆試交卷前花10秒看一眼屏幕右下角的時(shí)間如果還有剩余把每道題的最小邊界用例在腦子里跑一遍往往能救回不少分。希望這篇復(fù)盤對(duì)你有用祝今年校招順利。