
這幾年看春招和秋招的筆試復(fù)盤(pán)發(fā)現(xiàn)一個(gè)反直覺(jué)的現(xiàn)象很多人刷了幾百道題真題模擬也做了一堆結(jié)果在線筆試照樣掛反而是平時(shí)刷題量不大的人筆試通過(guò)率高得驚人。問(wèn)題不出在題目難度而是絕大多數(shù)人把筆試編程題當(dāng)成了“算法競(jìng)賽”一上來(lái)就暴力、秀技巧、圖最快卻忘了大廠筆試本質(zhì)上是一場(chǎng)限時(shí)工程能力測(cè)試。今天這篇文章我不打算帶大家刷完某個(gè)具體題庫(kù)而是借一家以電商業(yè)務(wù)起家的頭部互聯(lián)網(wǎng)公司以下統(tǒng)一叫“某大廠”的筆試風(fēng)格聊聊筆試編程題背后那套篩選邏輯以及真正有效的備考路徑。無(wú)論你正在準(zhǔn)備校招還是跳槽只要目標(biāo)里有這種量級(jí)的大廠這篇文章應(yīng)該能幫你避開(kāi)我見(jiàn)過(guò)最多的那些坑。1. 先說(shuō)清楚某大廠筆試編程題到底在篩什么1.1 從“會(huì)做題”到“會(huì)工程化表達(dá)”的差距很多人有一個(gè)錯(cuò)覺(jué)筆試嘛只要AC就好。但真正參與過(guò)閱卷或面試復(fù)盤(pán)就會(huì)知道在線筆試的判定遠(yuǎn)不止“輸出對(duì)不對(duì)”。自動(dòng)化用例會(huì)跑掉大部分錯(cuò)誤答案但遇到性能邊界、內(nèi)存邊界、極端輸入能活下來(lái)的代碼通常不是最聰明的而是最“穩(wěn)”的。舉個(gè)例子一道求子集最優(yōu)解的題有人用遞歸回溯有人用動(dòng)態(tài)規(guī)劃兩者都能通過(guò)小規(guī)模樣例??僧?dāng)n從20變成1000時(shí)回溯直接超時(shí)這就是典型的“用例全過(guò)但復(fù)雜度不行”。反過(guò)來(lái)有人寫(xiě)了最優(yōu)復(fù)雜度但忘記處理輸入為空的情況或者全局變量初始化位置寫(xiě)錯(cuò)在筆試系統(tǒng)的并發(fā)測(cè)試?yán)镏苯哟狄粯幽貌坏椒?。所以公司要篩的不是“會(huì)不會(huì)某個(gè)算法”而是“遇到一個(gè)之前沒(méi)見(jiàn)過(guò)的業(yè)務(wù)問(wèn)題你能不能快速抽象成數(shù)學(xué)模型寫(xiě)出一個(gè)可讀、可靠、復(fù)雜度合理的程序”。1.2 筆試考察的能力清單與常見(jiàn)誤區(qū)與其猜題目不如先按照筆試官方的“能力雷達(dá)圖”反推。我把這些年在筆試中看到的失敗案例歸納成五類(lèi)基本覆蓋所有失分點(diǎn)。能力維度考察方式常見(jiàn)失敗原因問(wèn)題抽象用自然語(yǔ)言描述業(yè)務(wù)場(chǎng)景讓候選人轉(zhuǎn)成輸入輸出模型沒(méi)看清數(shù)據(jù)范圍就動(dòng)手寫(xiě)憑感覺(jué)設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)算法與復(fù)雜度權(quán)衡大樣例驗(yàn)證時(shí)間復(fù)雜度隱藏用例卡常數(shù)只會(huì)套模板不理解模板的適用前提邊界處理空列表、單元素、極大極小值、溢出不寫(xiě)防御式代碼默認(rèn)所有輸入都合法代碼工程能力閱卷人肉眼查看變量命名、函數(shù)拆分、注釋一個(gè)Main函數(shù)堆到底命名全是a、b、tmp調(diào)試能力遇到答案錯(cuò)誤時(shí)是否能在有限時(shí)間內(nèi)定位沒(méi)有打印日志的習(xí)慣一錯(cuò)就換思路重寫(xiě)這五類(lèi)能力里最容易被忽視的是“問(wèn)題抽象”。很多候選人看到長(zhǎng)題干就慌習(xí)慣性在草稿上畫(huà)輸入輸出格式卻沒(méi)花時(shí)間把“業(yè)務(wù)約束”翻譯成算法約束。比如題干里出現(xiàn)“訂單優(yōu)先級(jí)”“庫(kù)存上限”“時(shí)間窗口”這些詞背后可能就是排序、背包、區(qū)間調(diào)度。讀題前30秒的正確動(dòng)作不是準(zhǔn)備代碼模板而是圈出所有數(shù)字約束n的取值范圍、每條數(shù)據(jù)的取值范圍、輸出是否要排序——這些才是決定算法選型的核心。2. 高頻題型地圖每種題型的“死穴”在哪里2.1 數(shù)組、字符串與雙指針模板背后是“單調(diào)性”筆試?yán)飻?shù)組和字符串永遠(yuǎn)占大頭但真正讓人掛掉的不是不會(huì)寫(xiě)雙指針而是不知道什么時(shí)候能用雙指針。滑動(dòng)窗口的邏輯很簡(jiǎn)單右指針往前探左指針跟在后面收縮窗口維護(hù)一個(gè)狀態(tài)??珊芏嗳吮沉四0鍏s忽略了“狀態(tài)必須單調(diào)”這個(gè)前提。比如找滿足某個(gè)條件的最短子數(shù)組如果條件關(guān)于窗口長(zhǎng)度不是單調(diào)的滑動(dòng)窗口就會(huì)失效。我建議碰到涉及“連續(xù)子數(shù)組”的題先畫(huà)一個(gè)例子把右端點(diǎn)固定住看左端點(diǎn)右移時(shí)窗口狀態(tài)是變好還是變壞。只有狀態(tài)是單向變化的雙指針才成立。否則老老實(shí)實(shí)考慮前綴和、二分或者哈希表。這個(gè)思考過(guò)程筆試時(shí)只要花兩分鐘就能省下后面大量重寫(xiě)時(shí)間。2.2 動(dòng)態(tài)規(guī)劃別急著想狀態(tài)轉(zhuǎn)移先想暴力動(dòng)態(tài)規(guī)劃是大廠筆試的分水嶺也是最容易被“套路”帶溝里的題型。很多人喜歡從記憶化遞推公式開(kāi)始背但一遇到變形題就卡住。我的習(xí)慣是反著來(lái)先寫(xiě)暴力遞歸比如dfs(index, remaining)然后觀察遞歸參數(shù)的數(shù)量和取值范圍。有幾個(gè)可變參數(shù)狀態(tài)就是幾維參數(shù)取值范圍相乘就是狀態(tài)總數(shù)。狀態(tài)總數(shù)不大就用記憶化狀態(tài)總數(shù)太大就需要考慮壓縮、貪心或數(shù)據(jù)增益。拿經(jīng)典的0-1背包舉例暴力遞歸就是dfs(i, cap)從第 i 個(gè)物品開(kāi)始當(dāng)前背包容量 cap返回后續(xù)能獲得的最大價(jià)值。把這個(gè)遞歸寫(xiě)成兩層循環(huán)的DPdp[i][cap]就是在填一張二維表。很多候選人卡在“為什么倒序更新一維數(shù)組”其實(shí)只要理解為“每個(gè)物品只能用一次”倒序保證了不會(huì)把當(dāng)前物品重復(fù)放進(jìn)去。這個(gè)道理通了比背一百道背包題都有用。2.3 圖論與搜索真正拉開(kāi)差距的地方圖論題在某大廠筆試?yán)镎急炔蝗鐢?shù)組和DP但一旦出現(xiàn)往往是壓軸分。這里的核心技術(shù)點(diǎn)不是最短路徑模板而是“狀態(tài)設(shè)計(jì)”。常見(jiàn)題型有多源BFS、拓?fù)渑判?、狀態(tài)壓縮BFS、帶權(quán)最短路。死穴也出在這里很多人算不清狀態(tài)總數(shù)導(dǎo)致內(nèi)存超限或者時(shí)間復(fù)雜度假得離譜。舉個(gè)例子一個(gè)二維迷宮最短步數(shù)BFS沒(méi)問(wèn)題。但如果額外增加“可以消除一個(gè)障礙”狀態(tài)就從(x,y)變成(x,y,used)used只有0和1兩種總狀態(tài)數(shù)乘以2BFS依然可行??捎腥藳](méi)拆這個(gè)維度非要在隊(duì)列里存“最多還能消幾次”每次出隊(duì)再枚舉后續(xù)所有可能結(jié)果狀態(tài)爆炸。另一個(gè)容易被忽略的是圖論里模棱兩可的部分。筆試題目一般不會(huì)直接說(shuō)“這就是Dijkstra”而是用“城市”“航線”“站臺(tái)”這類(lèi)包裝。你要能識(shí)別出節(jié)點(diǎn)、邊、權(quán)重的本質(zhì)再套用合適的算法。如果題意是“經(jīng)過(guò)中轉(zhuǎn)的次數(shù)最少”那就是無(wú)權(quán)圖的BFS不是Dijkstra如果“每條路有長(zhǎng)度且要求總路程最短”那才是Dijkstra。把問(wèn)題翻譯成圖的建模能力比背算法庫(kù)更有用。3. 用一道“訂單分配”模擬題完整還原筆試現(xiàn)場(chǎng)3.1 題目描述與輸入輸出約定為了把上面的思路落到細(xì)節(jié)我構(gòu)造了一道非常典型的模擬題主題貼合電商業(yè)務(wù)但考的是0-1背包。這種題在大廠筆試?yán)锖艹R?jiàn)特點(diǎn)是業(yè)務(wù)背景復(fù)雜但模型簡(jiǎn)單。我把題目描述和輸入輸出格式都寫(xiě)清楚你可以拿它做一次完整的筆試演練。模擬項(xiàng)目X某電商平臺(tái)倉(cāng)庫(kù)有庫(kù)存總量S只存放一種熱門(mén)商品。平臺(tái)收到了n個(gè)訂單第i個(gè)訂單需要w[i]件商品完成后可以獲得p[i]元利潤(rùn)。每個(gè)訂單只能選擇接受或拒絕且不能分批發(fā)貨。平臺(tái)希望在不超過(guò)庫(kù)存S的前提下選出若干訂單使得總利潤(rùn)最大。注意商品件數(shù)和利潤(rùn)都是正整數(shù)。輸入格式第一行包含兩個(gè)整數(shù)n和S分別表示訂單數(shù)和庫(kù)存總量。第二行包含n個(gè)整數(shù)依次是每個(gè)訂單的需求量w[1]到w[n]。第三行包含n個(gè)整數(shù)依次是每個(gè)訂單的利潤(rùn)p[1]到p[n]。樣例輸入4 5 2 1 3 2 5 3 4 2對(duì)應(yīng)最優(yōu)解是選擇訂單1、2、4需求量為2125利潤(rùn)為53210。3.2 讀題后的三個(gè)動(dòng)作確認(rèn)數(shù)據(jù)范圍、建模、考慮復(fù)雜度如果這是一場(chǎng)真實(shí)的在線筆試看到這道題時(shí)前兩分鐘應(yīng)該做三件事。第一圈數(shù)據(jù)范圍。題目雖然沒(méi)有明確寫(xiě)n和S的最大值但這類(lèi)題通常n可能在100到1000之間S可能在10000以內(nèi)。如果想要穩(wěn)過(guò)先假設(shè)n≤500S≤10000那么O(n*S)就有可能在時(shí)間限制內(nèi)。如果n到了10的5次方S也很大那就不能簡(jiǎn)單用背包而要考慮搜索剪枝或貪心近似。第二建模。每個(gè)訂單只有接受或拒絕利潤(rùn)和需求量一一對(duì)應(yīng)這顯然是一個(gè)0-1背包的“物品選與不選”模型。庫(kù)存總量S是背包容量w[i]是物品重量p[i]是物品價(jià)值。第三定方案。如果選擇二維DP空間復(fù)雜度O(nS)當(dāng)n500、S10000時(shí)就是500萬(wàn)個(gè)int約20MB在線筆試內(nèi)存一般給256MB或更多可以接受。但為了更穩(wěn)可以用滾動(dòng)數(shù)組壓成一維空間直接降到O(S)。這就是我前面說(shuō)的先把暴力或基礎(chǔ)解法建立起來(lái)再通過(guò)觀察轉(zhuǎn)移特點(diǎn)做優(yōu)化比一上來(lái)就追求所謂最優(yōu)解明顯更安全。3.3 從暴力遞歸到一維動(dòng)態(tài)規(guī)劃的推導(dǎo)很多人知道0-1背包的公式但不知道它是怎么來(lái)的。我建議在腦子里快速過(guò)一遍暴力遞歸// 從第i個(gè)訂單開(kāi)始剩余容量cap能獲得的最大利潤(rùn) int dfs(int i, int cap) { if (i n) return 0; int res dfs(i 1, cap); // 不要第i個(gè) if (cap w[i]) { res Math.max(res, dfs(i 1, cap - w[i]) p[i]); // 要第i個(gè) } return res; }這個(gè)遞歸的解就是正確的但慢在重復(fù)計(jì)算。如果給這個(gè)遞歸加上記憶化它就已經(jīng)是二維DP的雛形。接下來(lái)轉(zhuǎn)成迭代用dp[i][cap]表示前i個(gè)訂單在容量cap下的最大利潤(rùn)。轉(zhuǎn)移方程是dp[i][cap] max(dp[i-1][cap], dp[i-1][cap-w[i]] p[i])再用滾動(dòng)數(shù)組壓縮成一行從后往前更新避免覆蓋尚未讀取的上一個(gè)狀態(tài)。完整代碼如下import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st new StringTokenizer(br.readLine()); int n Integer.parseInt(st.nextToken()); int S Integer.parseInt(st.nextToken()); int[] w new int[n 1]; int[] p new int[n 1]; st new StringTokenizer(br.readLine()); for (int i 1; i n; i) { w[i] Integer.parseInt(st.nextToken()); } st new StringTokenizer(br.readLine()); for (int i 1; i n; i) { p[i] Integer.parseInt(st.nextToken()); } int[] dp new int[S 1]; for (int i 1; i n; i) { for (int cap S; cap w[i]; cap--) { dp[cap] Math.max(dp[cap], dp[cap - w[i]] p[i]); } } System.out.println(dp[S]); } }這段代碼可以直接跑通樣例。注意輸入用了BufferedReader和StringTokenizer不是為了炫技而是因?yàn)楹芏嘣诰€筆試的輸入規(guī)模很大Scanner在循環(huán)里逐行讀取容易超時(shí)。筆試是分秒必爭(zhēng)的地方IO這里的差距經(jīng)常被忽視。3.4 復(fù)雜度、邊界樣例與易錯(cuò)點(diǎn)復(fù)盤(pán)這段代碼的時(shí)間復(fù)雜度是O(n*S)空間復(fù)雜度O(S)已經(jīng)是最優(yōu)標(biāo)準(zhǔn)。但真正筆試時(shí)只寫(xiě)出主流程還不夠邊界用例往往決定能不能拿到這題的滿分。我建議在本地額外測(cè)三組數(shù)據(jù)n1只有一個(gè)訂單。如果w[1]S就輸出p[1]否則輸出0。代碼里兩層循環(huán)天然處理了這個(gè)情況。w[i]大于S的訂單。代碼中內(nèi)層循環(huán)從S遞減到w[i]當(dāng)w[i]S時(shí)根本不會(huì)進(jìn)入循環(huán)所以會(huì)自動(dòng)跳過(guò)這個(gè)訂單。所有訂單需求量總和小于S。此時(shí)dp數(shù)組會(huì)被完整更新最終答案是全部訂單利潤(rùn)之和這也不會(huì)有問(wèn)題。還有一個(gè)很多人踩的坑如果題目要求輸出最大利潤(rùn)但又問(wèn)“如果有多組最優(yōu)解輸出字典序最小的訂單編號(hào)”那就不是上面這段代碼能直接搞定的。需要在DP狀態(tài)轉(zhuǎn)移時(shí)當(dāng)“不選”和“選”產(chǎn)生相同利潤(rùn)時(shí)優(yōu)先記錄“選”然后從后向前回溯訂單列表。這個(gè)擴(kuò)展經(jīng)常被用來(lái)區(qū)分AC和精通建議在備考時(shí)單獨(dú)練一下。好在這道模擬題的題干沒(méi)有這個(gè)要求我們這里用最簡(jiǎn)潔版本就夠了。4. 在線筆試環(huán)境里那些“看不見(jiàn)”的失分點(diǎn)4.1 輸入輸出的兩種模式與代碼模板很多人把刷題環(huán)境當(dāng)IDE忽略了在線筆試的IO規(guī)則。某大廠筆試系統(tǒng)一般分兩種模式一種是“核心代碼模式”你只需要實(shí)現(xiàn)一個(gè)類(lèi)的方法入?yún)⒊鰠⒁呀?jīng)定義好另一種是“ACM模式”需要自己解析標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出。大部分校招筆試用的是ACM模式這是失分重災(zāi)區(qū)。我的做法是準(zhǔn)備一套自己的IO模板。輸入統(tǒng)一用BufferedReader讀行再用StringTokenizer按空格拆分。輸出統(tǒng)一放到StringBuilder里最后一次性print減少單條輸出帶來(lái)的系統(tǒng)調(diào)用。這套模板能應(yīng)對(duì)絕大多數(shù)需要讀多行、輸出一行的場(chǎng)景。還有一類(lèi)細(xì)節(jié)某些題目要求循環(huán)處理多個(gè)測(cè)試用例直到讀入EOF。這時(shí)候不能假設(shè)一定讀得到第一行。代碼里應(yīng)使用while (br.ready())或者while ((line br.readLine()) ! null)來(lái)判斷。遇到?jīng)]有更多輸入時(shí)程序要能正常退出而不是拋空指針。4.2 超時(shí)與內(nèi)存限制的定位技巧筆試現(xiàn)場(chǎng)最容易出現(xiàn)的情況是“本地跑得好好的一提交就超時(shí)”。原因無(wú)外乎三種復(fù)雜度太高、IO太慢、死循環(huán)。如果代碼本地測(cè)幾個(gè)小用例都正常一到大數(shù)據(jù)就超時(shí)優(yōu)先懷疑復(fù)雜度如果小數(shù)據(jù)也偶爾卡死優(yōu)先懷疑死循環(huán)。我見(jiàn)過(guò)不少候選人寫(xiě)了while(true)配合break條件寫(xiě)錯(cuò)本地怎么測(cè)都碰不到那條分支一到邊界數(shù)據(jù)就卡死。建議所有循環(huán)都標(biāo)注清楚“什么時(shí)候退出”在Debug時(shí)多打印一下計(jì)數(shù)器。內(nèi)存超限的根子一般也不是“內(nèi)存不夠”而是狀態(tài)數(shù)組開(kāi)太大。比如n1000卻開(kāi)了一個(gè)n*n的二維數(shù)組每個(gè)格子存long內(nèi)存直接爆掉。在寫(xiě)DP之前先算一下?tīng)顟B(tài)容量1000*1000*8字節(jié)8MB看起來(lái)不大但如果狀態(tài)本身是結(jié)構(gòu)體可能就變幾十MB。一個(gè)實(shí)用原則是能用一維滾動(dòng)數(shù)組不用二維能用int不用long能二分不枚舉所有狀態(tài)。當(dāng)然前提是不溢出。4.3 代碼規(guī)范性變量命名、注釋與防御式編程有人覺(jué)得筆試代碼只要過(guò)了用例命名無(wú)所謂。但很多大廠筆試之后面試官會(huì)重新調(diào)出你的原始代碼跟面試時(shí)的討論結(jié)合起來(lái)看。一個(gè)類(lèi)名全是a、b、tmp的代碼給面試官的印象就是“這個(gè)候選人的工程習(xí)慣還很初級(jí)”。反過(guò)來(lái)說(shuō)變量命名能表達(dá)業(yè)務(wù)含義注釋能寫(xiě)清楚轉(zhuǎn)移方程代碼結(jié)構(gòu)自然分成“讀入”、“計(jì)算”、“輸出”三部這樣即使有個(gè)別用例沒(méi)過(guò)面試官也更容易幫你找到可以補(bǔ)救的點(diǎn)。防御式編程也很重要。筆試輸入一般不會(huì)非法但偶爾有惡心的隱藏用例比如數(shù)組為空、數(shù)字前有多個(gè)空格、輸入末尾有換行。用StringTokenizer能自動(dòng)忽略多余空格但如果需要讀一行自定義字符串最好先trim()一下。再比如求a * b可能溢出即使筆試不卡邊際也盡量用long存儲(chǔ)中間結(jié)果。這些不是考題重點(diǎn)但卻是區(qū)分“能用”和“好用”的關(guān)鍵。5. 90天備考規(guī)劃刷題數(shù)量不重要復(fù)盤(pán)習(xí)慣才重要5.1 分階段計(jì)劃前期專(zhuān)項(xiàng)、中期模擬、后期查漏如果你離筆試還有三個(gè)月我不建議從第一天就開(kāi)始刷“每日一題”那樣到后面很容易變成感動(dòng)自己的無(wú)用功。更靠譜的方式是分三個(gè)階段。第1到第4周做專(zhuān)項(xiàng)突破。按數(shù)據(jù)結(jié)構(gòu)劃分?jǐn)?shù)組、鏈表、棧/隊(duì)列、哈希表、樹(shù)、圖、動(dòng)態(tài)規(guī)劃、貪心。每天只看一類(lèi)題每類(lèi)至少搞懂20道題吃透“為什么用這個(gè)數(shù)據(jù)結(jié)構(gòu)”而不是“這題AC了”。比如鏈表題就死磕“雙指針、遞歸、頭節(jié)點(diǎn)哨兵”這三板斧動(dòng)態(tài)規(guī)劃就死磕“設(shè)計(jì)狀態(tài)、寫(xiě)轉(zhuǎn)移、初始化、滾動(dòng)優(yōu)化”這條路。第5到第8周開(kāi)始全真模擬。每周至少3次完整的在線筆試用真實(shí)的限時(shí)環(huán)境一次2小時(shí)做一套完整試卷。重點(diǎn)不是分?jǐn)?shù)而是建立“時(shí)間分配”的手感。我的建議是前5分鐘掃完全部題目給每道題預(yù)設(shè)一個(gè)時(shí)間上限比如簡(jiǎn)單題20分鐘、中等題35分鐘、難題留30分鐘但允許放棄。一旦超過(guò)預(yù)設(shè)時(shí)間立即跳過(guò)做下一題不要戀戰(zhàn)。第9到第12周回歸錯(cuò)題和查漏。把前三周做錯(cuò)的題重新拿出來(lái)限時(shí)重寫(xiě)。你會(huì)發(fā)現(xiàn)很多題當(dāng)時(shí)看題解秒懂一周后再寫(xiě)還是卡在同一處。這時(shí)候才能把短板徹底補(bǔ)上。如果時(shí)間緊張至少要保證每周做一次的限時(shí)??纪瑫r(shí)把之前的錯(cuò)題本翻一遍。5.2 如何做“一題三遍”的深度復(fù)盤(pán)很多優(yōu)秀備考生都認(rèn)同一個(gè)做法同一道題至少做三遍。第一遍在限定時(shí)間內(nèi)獨(dú)立完成哪怕只能用暴力解也要寫(xiě)出可運(yùn)行的代碼。第二遍在AC之后立刻嘗試優(yōu)化復(fù)雜度或者去看別人的解法理解更優(yōu)的狀態(tài)設(shè)計(jì)。第三遍是在一周之后合上題解重新限時(shí)重寫(xiě)一次。第三遍如果能寫(xiě)出來(lái)而且能說(shuō)明為什么之前會(huì)卡住這道題才算真正內(nèi)化。復(fù)盤(pán)時(shí)我建議給每個(gè)錯(cuò)題記四件事題目抽象后的模型是什么、我最初為什么卡住、最優(yōu)解的核心狀態(tài)或單調(diào)性在哪里、如果重新來(lái)一次哪個(gè)環(huán)節(jié)可以先做判斷。把這些記下來(lái)遠(yuǎn)比“今天刷了30道題”更有價(jià)值。筆試考的從來(lái)不是“見(jiàn)過(guò)的題多不多”而是“遇到?jīng)]見(jiàn)過(guò)的題時(shí)能不能快速構(gòu)建出解法”。5.3 筆試前一天和考試中的時(shí)間分配建議筆試前一天不要做新題更不要熬夜。把常用的IO模板背一遍把所有算法模板的核心判斷條件過(guò)一遍比如二分模板的邊界、BFS的visited初始化、背包的循環(huán)順序。然后早點(diǎn)休息。真正決定成績(jī)的是第二天考場(chǎng)上的狀態(tài)??荚囬_(kāi)始后第一件事是把所有題目快速掃一遍在草稿紙上標(biāo)出容易題、中等題、難題。先做容易題保證拿分再做中等題留出足夠時(shí)間最后剩時(shí)間再碰難題。如果遇到一道題5分鐘沒(méi)有思路果斷換下一題別讓一道題毀掉整場(chǎng)節(jié)奏。筆試不是展示執(zhí)著的地方是展示產(chǎn)出效率的地方。還有一個(gè)小技巧輸出答案前先重新讀一遍樣例格式尤其是“每個(gè)數(shù)字后面有沒(méi)有空格”這類(lèi)細(xì)節(jié)。很多人思路全對(duì)輸出多了一個(gè)空格或換行被判WA這就太冤了。寫(xiě)完代碼后用題目給的樣例跑一遍再用一個(gè)自己構(gòu)造的邊界樣例跑一遍這兩個(gè)動(dòng)作能避免至少30%的低級(jí)錯(cuò)誤。6. 最后聊點(diǎn)個(gè)人體會(huì)看了這么多年的筆試記錄我最大的感受是能通過(guò)某大廠筆試的往往不是知識(shí)點(diǎn)最淵博的人而是對(duì)“限時(shí)、資源、邊界、輸出”這些非算法約束非常敏感的人。算法思維是骨架工程習(xí)慣是血肉考場(chǎng)管理是神經(jīng)。三者缺一都會(huì)在最不起眼的地方摔跟頭。如果你最近正在準(zhǔn)備這類(lèi)考試我特別建議從今天開(kāi)始做一件事每天把一道做過(guò)題的“解題路徑”講給自己聽(tīng)包括為什么選這個(gè)算法、邊界在哪里、復(fù)雜度是多少。能講清楚比多做十道題更有用。至于刷題數(shù)量真到筆試那天你會(huì)發(fā)現(xiàn)心態(tài)穩(wěn)定、輸入輸出熟練、邊界用例想得周全才是讓你發(fā)揮出真實(shí)水平的關(guān)鍵。