算法筆試避坑指南:ACM輸入輸出與四大高頻考點(diǎn)全解析)
一場(chǎng)美團(tuán)算法筆試我寫(xiě)滿(mǎn)了編輯器卻被判了零分要說(shuō)校招筆試哪家最讓我記憶深刻美團(tuán)絕對(duì)排得上前三。倒不是題目有多變態(tài)而是第一次參加大廠(chǎng)在線(xiàn)筆試時(shí)我在自帶的本地編輯器里把代碼跑得漂漂亮亮結(jié)果提交到??途W(wǎng)判題系統(tǒng)直接一個(gè)大大的編譯錯(cuò)誤當(dāng)時(shí)的崩潰感我現(xiàn)在還記得。后來(lái)復(fù)盤(pán)才發(fā)現(xiàn)問(wèn)題出在輸入輸出處理上——本地能跑是因?yàn)槲沂謩?dòng)輸入了測(cè)試數(shù)據(jù)而在線(xiàn)評(píng)測(cè)系統(tǒng)需要從標(biāo)準(zhǔn)輸入流讀取多組數(shù)據(jù)格式稍有不對(duì)就是零分。這種因?yàn)椤案袷絾?wèn)題”丟掉的分比不會(huì)做題還讓人憋屈。這篇內(nèi)容我打算根據(jù)2023屆美團(tuán)校招算法筆試的備考經(jīng)歷結(jié)合我自己和周?chē)瑢W(xué)的真實(shí)踩坑記錄把這類(lèi)大廠(chǎng)算法筆試的核心題型、做題順序、代碼模板、易錯(cuò)細(xì)節(jié)全部捋一遍。不管你是正在準(zhǔn)備2025屆校招還是剛上大三開(kāi)始刷題這篇內(nèi)容都能幫你少走不少?gòu)澛?。先說(shuō)結(jié)論美團(tuán)的算法筆試難度在全網(wǎng)大廠(chǎng)里屬于中等偏上不那么“套路”很喜歡把業(yè)務(wù)場(chǎng)景外賣(mài)配送、商家排序、用戶(hù)調(diào)度包裝成算法題核心考點(diǎn)集中在動(dòng)態(tài)規(guī)劃、貪心、圖論、字符串處理、模擬這幾大類(lèi)。題型是選擇題加編程題混合編程題3道左右滿(mǎn)分100分時(shí)編程題能占到70分往上。換句話(huà)說(shuō)編程題是你能不能進(jìn)面試的分水嶺。1. 一場(chǎng)筆試90分鐘我是怎么分配時(shí)間把三題全部寫(xiě)完的美團(tuán)校招的在線(xiàn)筆試一般是90分鐘題型分布比較固定前面是若干道選擇題考察計(jì)算機(jī)網(wǎng)絡(luò)、操作系統(tǒng)、數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)后面是2到3道算法編程題。選擇題占分不高但也不是白給的它背后有一層隱藏邏輯——篩掉那些純靠背題、沒(méi)有任何計(jì)算機(jī)基礎(chǔ)功底的人。先說(shuō)我的做題順序。第一輪我會(huì)花3分鐘把三道編程題全部看一遍注意是全部不是做完一道再看下一道。這樣做的原因很簡(jiǎn)單編程題的難度排序通常不是按題目編號(hào)排列的有時(shí)候第1題反而是全卷最難的后面的題反而簡(jiǎn)單。如果你死磕第1題到時(shí)間結(jié)束時(shí)才發(fā)現(xiàn)第2、3題很水那種感覺(jué)就是虧大了。三道題快速看完之后我會(huì)預(yù)估一個(gè)難度梯度比如“第1題中等、第2題簡(jiǎn)單、第3題困難”。然后先把第2題這種簡(jiǎn)單題秒掉鎖定基本分再回頭啃第1題或第3題。如果一道題10分鐘沒(méi)有任何思路先跳過(guò)千萬(wàn)不要硬剛等最后有剩余時(shí)間再回頭兜底。這里有一個(gè)特別實(shí)用的細(xì)節(jié)很多題存在部分分機(jī)制。也就是說(shuō)即使你的算法不是最優(yōu)解甚至只能過(guò)一部分測(cè)試用例判題系統(tǒng)也會(huì)按通過(guò)的比例給分。比如最后一道DP動(dòng)態(tài)規(guī)劃題你寫(xiě)了個(gè)暴力遞歸時(shí)間復(fù)雜度很高但數(shù)據(jù)量小的測(cè)試點(diǎn)能過(guò)你就能拿到百分之二三十的分?jǐn)?shù)。所以哪怕不會(huì)最優(yōu)解也一定要寫(xiě)點(diǎn)東西上去空提交等于直接送掉整題的分。2. 題型結(jié)構(gòu)拆解美團(tuán)筆試真正在考什么美團(tuán)算法筆試的題目包裝風(fēng)格一句話(huà)形容是“業(yè)務(wù)即題目”。對(duì)比字節(jié)跳動(dòng)喜歡直接出純粹的算法題美團(tuán)更喜歡在題目背景里套一層業(yè)務(wù)場(chǎng)景。比如外賣(mài)騎手的配送路線(xiàn)優(yōu)化、商家的排序策略、用戶(hù)紅包的補(bǔ)貼分配這些場(chǎng)景包裝背后藏著的其實(shí)是經(jīng)典的算法模型。你如果擅長(zhǎng)從題干里抽離出數(shù)學(xué)本質(zhì)這道題就已經(jīng)解了一半。2.1 選擇題靠押題不如靠扎實(shí)基礎(chǔ)選擇題大概占20到30分考的內(nèi)容比較雜高頻知識(shí)點(diǎn)包括TCP三次握手和四次揮手的狀態(tài)遷移操作系統(tǒng)的進(jìn)程調(diào)度算法先來(lái)先服務(wù)、短作業(yè)優(yōu)先、時(shí)間片輪轉(zhuǎn)數(shù)據(jù)庫(kù)事務(wù)的隔離級(jí)別臟讀、不可重復(fù)讀、幻讀二叉樹(shù)的遍歷序列還原已知前序中序求后序這種哈希沖突的解決方法鏈地址法、開(kāi)放定址法面向?qū)ο蟮娜筇匦耘c多態(tài)的實(shí)現(xiàn)原理這部分我建議大家不要花太多精力去搞什么考前突擊因?yàn)榉秶珡V了。最好的準(zhǔn)備方式是刷??蜕系挠?jì)算機(jī)基礎(chǔ)題以及把《計(jì)算機(jī)網(wǎng)絡(luò)自頂向下方法》和操作系統(tǒng)教材的課后題過(guò)一遍。選擇題的目標(biāo)不是拿滿(mǎn)分而是控制在錯(cuò)3題以?xún)?nèi)。2.2 編程題三道題的難度矩陣以我的經(jīng)驗(yàn)來(lái)看美團(tuán)的編程題會(huì)盡量避開(kāi)那種爛大街的模板題很少直接考“最長(zhǎng)公共子序列”“背包九講”這類(lèi)原題。他們喜歡做的動(dòng)作是把一個(gè)經(jīng)典算法模型藏進(jìn)一個(gè)故事里。比如外觀(guān)描述像是“小美要安排外賣(mài)騎手在不同商家取餐并送往用戶(hù)”抽離出來(lái)可能就是一個(gè)帶權(quán)重的最短路徑問(wèn)題再比如外觀(guān)描述是“某商圈有多個(gè)商家需要對(duì)優(yōu)惠券分配進(jìn)行優(yōu)化”實(shí)際上考的是貪心加排序。這種包裝方式對(duì)兩類(lèi)人特別不友好一類(lèi)是只背模板、不理解算法本質(zhì)的人換個(gè)情境就認(rèn)不出題了另一類(lèi)是審題不仔細(xì)、被題干故事帶跑偏的人會(huì)陷入思考業(yè)務(wù)邏輯而忘記用經(jīng)典算法去求解。我見(jiàn)過(guò)太多人把時(shí)間浪費(fèi)在揣摩“美團(tuán)的外賣(mài)業(yè)務(wù)到底怎么運(yùn)作”上其實(shí)完全沒(méi)必要。正確做法是讀題時(shí)直接在草稿紙上抽象把題干里的名詞替換掉。不要想“騎手怎么走最優(yōu)”要想“這張圖求最短路徑”不要想“商家怎么排序更合理”要想“這個(gè)排序的關(guān)鍵比較函數(shù)是什么”。抽離完成之后這道題就變成了你可以直接套模板的常規(guī)題。3. 四個(gè)高頻考點(diǎn)的現(xiàn)場(chǎng)破解實(shí)例為了講得更具體我從2023屆美團(tuán)校招筆試的題型方向出發(fā)結(jié)合牛客網(wǎng)、小紅書(shū)、知乎上的大量面經(jīng)復(fù)盤(pán)把最常出現(xiàn)的四類(lèi)考點(diǎn)逐一拆解。題目本身我做了脫敏重構(gòu)保證不涉及真實(shí)原題但題型結(jié)構(gòu)和解題思路是高度一致的。3.1 動(dòng)態(tài)規(guī)劃外賣(mài)配送路徑的狀態(tài)設(shè)計(jì)美團(tuán)筆試?yán)飫?dòng)態(tài)規(guī)劃幾乎是必考的但很少考那種一眼就看出是DP的題更多是“狀態(tài)轉(zhuǎn)移方程需要你自己設(shè)計(jì)”的類(lèi)型。我印象最深的是2023屆出現(xiàn)過(guò)一道和配送路徑相關(guān)的題目有若干用戶(hù)分布在一條直線(xiàn)上外賣(mài)員需要從起點(diǎn)出發(fā)以某種順序依次服務(wù)用戶(hù)要求最小化總路程。這類(lèi)題的第一反應(yīng)可能是貪心但仔細(xì)一想就會(huì)發(fā)現(xiàn)貪心不對(duì)——因?yàn)槁窂娇梢噪p向選擇每次選最近的用戶(hù)并不能保證全局最優(yōu)。正確建模是區(qū)間DP把已服務(wù)的用戶(hù)看成一個(gè)連續(xù)區(qū)間用dp[i][j][0/1]表示“已經(jīng)服務(wù)完區(qū)間[i, j]內(nèi)的用戶(hù)外賣(mài)員當(dāng)前在左端點(diǎn)還是在右端點(diǎn)”時(shí)的最小路程。// C 狀態(tài)定義示例 // dp[i][j][0]已服務(wù) [i, j] 區(qū)間位于 i // dp[i][j][1]已服務(wù) [i, j] 區(qū)間位于 j vectorvectorvectorlong long dp(n, vectorvectorlong long(n, vectorlong long(2, INF))); dp[i][i][0] dp[i][i][1] abs(users[i] - startPos); // 從起點(diǎn)直沖第一個(gè)用戶(hù) // 轉(zhuǎn)移時(shí)從擴(kuò)展一個(gè)用戶(hù)的來(lái)源位置累加路程差這個(gè)狀態(tài)設(shè)計(jì)的核心邏輯是外賣(mài)員走過(guò)的用戶(hù)必然是連續(xù)的因?yàn)榉?wù)過(guò)的用戶(hù)沒(méi)有必要再回去所以區(qū)間模型天然成立?,F(xiàn)場(chǎng)推導(dǎo)狀態(tài)方程時(shí)我建議用表格法把小區(qū)間推到大區(qū)間心里會(huì)更踏實(shí)。DP歷來(lái)是算法筆試的分水嶺40%的人死在第2題和第3題上。如果你現(xiàn)在時(shí)間還充裕務(wù)必把線(xiàn)性DP、背包、區(qū)間DP、狀壓DP這幾個(gè)方向好好過(guò)一遍狀態(tài)設(shè)計(jì)、轉(zhuǎn)移方程、初始化和優(yōu)化技巧一個(gè)都不能漏。3.2 貪心加排序商家配送的區(qū)間覆蓋問(wèn)題2023屆筆試?yán)镉幸坏雷屛矣∠笊羁痰念}外觀(guān)場(chǎng)景是某地區(qū)有若干商家每家有一個(gè)配送范圍區(qū)間問(wèn)至少需要多少位騎手才能覆蓋所有商家的配送需求。剝掉外衣之后這就是一道經(jīng)典的區(qū)間調(diào)度類(lèi)貪心題。區(qū)間覆蓋最少騎手?jǐn)?shù)這個(gè)問(wèn)題細(xì)想之下其實(shí)有兩種變體。第一種是“選最少區(qū)間覆蓋整個(gè)目標(biāo)區(qū)間”第二種是“所有區(qū)間需要的最大重疊深度”。美團(tuán)的題更??己笳邔⑺袇^(qū)間按左端點(diǎn)排序用小根堆維護(hù)當(dāng)前已分配的騎手的最早空閑時(shí)間逐個(gè)區(qū)間判斷是復(fù)用已有騎手還是新開(kāi)騎手。// C 貪心示例框架 sort(intervals.begin(), intervals.end()); // 按左端點(diǎn)升序 priority_queueint, vectorint, greaterint pq; // 記錄每名騎手的結(jié)束時(shí)間 for (auto [l, r] : intervals) { if (!pq.empty() pq.top() l) { pq.pop(); // 最早空閑的騎手可以復(fù)用 } pq.push(r); // 這名騎手的新結(jié)束時(shí)間 } int ans pq.size(); // 需要的騎手?jǐn)?shù)貪心題最難的點(diǎn)不是代碼而是證明貪心策略的正確性?,F(xiàn)場(chǎng)答題時(shí)不需要寫(xiě)嚴(yán)格數(shù)學(xué)證明但你必須在心里確認(rèn)“為什么按左端點(diǎn)排序順序處理就是最優(yōu)的”。我的驗(yàn)證套路是瘋狂舉反例如果先處理區(qū)間短的會(huì)怎樣如果按右端點(diǎn)排序會(huì)怎樣舉兩三個(gè)反例發(fā)現(xiàn)推不翻就果斷相信這個(gè)策略。3.3 圖論變種商家地圖上的連通性與最短路圖論題目在美團(tuán)筆試?yán)锍霈F(xiàn)頻率也不低尤其是最小生成樹(shù)和單源最短路徑這兩個(gè)方向。因?yàn)橥赓u(mài)配送場(chǎng)景天然和地圖、路徑綁定所以圖論很容易被包裝成業(yè)務(wù)題。有一道我印象深刻的題是這樣的給定一個(gè)配送區(qū)域的地圖若干商家節(jié)點(diǎn)和道路求從外賣(mài)站點(diǎn)出發(fā)送完所有商家再返回的最短路徑長(zhǎng)度。乍一看是旅行商問(wèn)題TSP但數(shù)據(jù)范圍較小可以用狀態(tài)壓縮DP來(lái)求解dp[mask][i]表示已經(jīng)送過(guò)集合mask里的商家當(dāng)前在節(jié)點(diǎn)i的最短時(shí)間。先用Floyd算法預(yù)處理所有節(jié)點(diǎn)之間的最短距離再用狀壓DP枚舉子集轉(zhuǎn)移。// Python 狀壓DP思路示例 # dist[i][j] 由 Floyd 預(yù)處理得出 # dp[mask][i]送過(guò) mask 集合的商家當(dāng)前位置為 i 的最短時(shí)長(zhǎng) dp [[inf] * n for _ in range(1 m)] for i in range(m): dp[1 i][i] dist[start][i] for mask in range(1 m): for i in range(m): if not (mask i) 1: continue for j in range(m): if (mask j) 1: continue nmask mask | (1 j) dp[nmask][j] min(dp[nmask][j], dp[mask][i] dist[i][j])這種題對(duì)熟練度的要求很高如果現(xiàn)場(chǎng)才去推Floyd和狀壓DP的轉(zhuǎn)移公式大概率時(shí)間不夠。所以我建議備好一套自己的圖論模板庫(kù)Floyd、Dijkstra、SPFA、Kruskal、并查集全部提前封裝好。別嫌這步驟繁瑣考場(chǎng)上一分鐘能定生死。3.4 字符串與模擬批量訂單解析里的分而治之不要小看了字符串處理和模擬類(lèi)題目美團(tuán)的筆試非常喜歡用這類(lèi)題來(lái)卡那些算法很強(qiáng)但代碼實(shí)現(xiàn)能力弱的同學(xué)。有一年出現(xiàn)過(guò)一道訂單解析題輸入是一串帶嵌套結(jié)構(gòu)的數(shù)據(jù)要求解析出每一個(gè)訂單的關(guān)鍵字段字段之間有多層括號(hào)嵌套還要處理轉(zhuǎn)義字符。這類(lèi)題沒(méi)有太多算法含量但非??简?yàn)對(duì)邊界的處理能力。我的建議是無(wú)論多簡(jiǎn)單的模擬題都先拆成小的功能函數(shù)再寫(xiě)。例如括號(hào)解析單獨(dú)封裝一個(gè)函數(shù)字符串切分單獨(dú)封裝一個(gè)函數(shù)字段預(yù)處理單獨(dú)封裝一個(gè)函數(shù)。這樣如果某個(gè)函數(shù)出錯(cuò)你可以單獨(dú)測(cè)試它而不是在一個(gè)超長(zhǎng)的main函數(shù)里大海撈針。容易翻車(chē)的地方包括字符串結(jié)尾的空字符處理、多個(gè)連續(xù)分隔符造成的空字符串、轉(zhuǎn)義符影響了分隔符判斷、整型溢出。2023屆那個(gè)訂單解析題我知道有挺多人掛在“訂單內(nèi)容里本身有括號(hào)”這個(gè)反直覺(jué)的坑上——審題時(shí)注意看轉(zhuǎn)義規(guī)則千萬(wàn)不要想當(dāng)然。4. ACM模式與輸入輸出的生死線(xiàn)本地跑通不等于提交通過(guò)開(kāi)篇提到的編譯錯(cuò)誤其實(shí)是很多第一次參加線(xiàn)上筆試的人都會(huì)踩的坑。大廠(chǎng)在線(xiàn)筆試普遍采用ACM模式也就是你寫(xiě)的代碼需要自己處理標(biāo)準(zhǔn)輸入和輸出而不是像LeetCode那樣只需要補(bǔ)全函數(shù)體。這兩種模式到底有什么本質(zhì)區(qū)別講個(gè)通俗的比喻LeetCode模式是你在食堂打飯告訴阿姨要什么菜阿姨幫你配好放盤(pán)子里ACM模式是給你一堆食材你要自己洗、切、炒、裝盤(pán)。在LeetCode上你只需要實(shí)現(xiàn)一個(gè)類(lèi)方法參數(shù)和返回值框架都給好了ACM模式下你需要自己讀取數(shù)據(jù)、自己解析格式、自己輸出結(jié)果格式稍微不對(duì)判題系統(tǒng)就會(huì)判定答案錯(cuò)誤。美團(tuán)校招筆試幾乎全是ACM模式。這意味著你至少需要熟練掌握以下幾類(lèi)輸入輸出模板讀取一個(gè)整數(shù)、兩個(gè)整數(shù)、N個(gè)整數(shù)讀入后存入數(shù)組讀取一個(gè)字符串含空格和不含空格兩種情況讀取多組測(cè)試用例以文件結(jié)束符EOF終止讀取矩陣數(shù)據(jù)二維數(shù)組這里我直接給一套C常用的輸入輸出模板強(qiáng)烈建議提前保存在本地編輯器里。#include bits/stdc.h using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin n; vectorint a(n); for (int i 0; i n; i) { cin a[i]; } // 處理邏輯... cout ans \n; // 建議 \n 而不是 endl避免不必要的緩沖刷新 return 0; }多組輸入的情況下代碼邏輯要包在while循環(huán)里int T; cin T; while (T--) { // 每組獨(dú)立的處理邏輯 }還有一個(gè)細(xì)節(jié)如果題目沒(méi)說(shuō)輸入有多組測(cè)試用例就用單組處理如果說(shuō)了“輸入包含多組測(cè)試用例以EOF結(jié)束”那就要用while循環(huán)配合cin的判斷。很多人在這個(gè)點(diǎn)上判斷錯(cuò)誤結(jié)果導(dǎo)致超時(shí)或者死循環(huán)。Python的話(huà)我建議記住下面這個(gè)萬(wàn)能輸入模板import sys def solve(): data sys.stdin.read().split() # 按順序取出每個(gè)數(shù)字用迭代器方式避免搞亂索引 it iter(data) t int(next(it)) for _ in range(t): n int(next(it)) arr [int(next(it)) for _ in range(n)] # 處理邏輯 if __name__ __main__: solve()把全部?jī)?nèi)容一次性讀進(jìn)來(lái)再切分比逐行用input()讀要快得多在數(shù)據(jù)量大時(shí)能避免Python輸入耗時(shí)過(guò)高導(dǎo)致超時(shí)的問(wèn)題。5. 現(xiàn)場(chǎng)提交最容易翻車(chē)的五個(gè)細(xì)節(jié)結(jié)合自己和身邊同學(xué)的真實(shí)經(jīng)歷我整理了五個(gè)在線(xiàn)筆試最容易翻車(chē)、但完全可以在考前規(guī)避的細(xì)節(jié)。每一條都是真實(shí)血的教訓(xùn)。5.1 注意返回類(lèi)型long long不是可選項(xiàng)如果題目的數(shù)據(jù)范圍是10^5那么很多中間結(jié)果和最終答案很容易爆int。比如求和題10^5個(gè)數(shù)每個(gè)數(shù)10^5總和就是10^10超過(guò)int的21億上限必須用long long。我的習(xí)慣是只要看見(jiàn)數(shù)據(jù)范圍大于10^5或者題目涉及累加、乘積、路徑長(zhǎng)度計(jì)算直接無(wú)腦用long long絕不猶豫。不要高估int的能力也不要覺(jué)得“數(shù)據(jù)應(yīng)該不會(huì)那么極端”。筆試判題系統(tǒng)里什么邊界數(shù)據(jù)都有忘了long long就是一長(zhǎng)串Wrong Answer。5.2 數(shù)組越界與邊界值檢查二分查找、雙指針、滑動(dòng)窗口這類(lèi)題特別容易出現(xiàn)數(shù)組越界。測(cè)試用例規(guī)模小的時(shí)候能過(guò)一旦上了邊界數(shù)據(jù)就崩。我建議在寫(xiě)完核心邏輯后花至少一分鐘專(zhuān)門(mén)過(guò)一遍邊界情況數(shù)組為空、數(shù)組長(zhǎng)度為1、所有值相同、目標(biāo)值在最左端/最右端、目標(biāo)值不存在。這一步很枯燥但它能救你大量分?jǐn)?shù)。我認(rèn)識(shí)一位同學(xué)在一次??贾幸?yàn)闆](méi)處理“數(shù)組長(zhǎng)度為1”的情況一道30分的題直接0分前功盡棄。5.3 編譯器版本差異與萬(wàn)能頭文件的坑在線(xiàn)筆試系統(tǒng)通常支持C14或C17也支持#include bits/stdc.h這個(gè)萬(wàn)能頭文件但不是所有平臺(tái)都支持。有些平臺(tái)編譯會(huì)報(bào)錯(cuò)這時(shí)可以改成逐個(gè)引入你需要的頭文件#include iostream、#include vector、#include algorithm這些。另外auto、unordered_map、priority_queue在新版本里都能用但如果你用了一些C17的新特性最好先確認(rèn)平臺(tái)的編譯器版本。在線(xiàn)筆試不像本地可以隨便用標(biāo)準(zhǔn)真的提交不過(guò)就只能干瞪眼。5.4 遞歸爆棧問(wèn)題有些題目用深度優(yōu)先搜索遞歸實(shí)現(xiàn)很直觀(guān)但如果數(shù)據(jù)規(guī)模較大比如n等于10^5遞歸深度過(guò)高可能會(huì)在運(yùn)行時(shí)報(bào)棧溢出錯(cuò)誤。這時(shí)要么手動(dòng)改成顯式棧的迭代寫(xiě)法要么用Java/Python的同學(xué)要注意設(shè)置遞歸深度限制。# Python 中增加遞歸深度限制 import sys sys.setrecursionlimit(10**7)但即使設(shè)置了遞歸限制Python在大規(guī)模數(shù)據(jù)下仍然可能超時(shí)所以如果是深層遞歸的場(chǎng)景我最推薦的做法還是用棧模擬來(lái)替代遞歸。判斷遞歸深度是否穩(wěn)定的辦法很簡(jiǎn)單如果遞歸深度和輸入規(guī)模成正比且規(guī)模很大就要警惕。5.5 輸出格式強(qiáng)迫癥最后這個(gè)是我最想強(qiáng)調(diào)的坑輸出格式。題目要求輸出“YES”或“NO”你輸出了“Yes”或“yes”錯(cuò)誤。題目要求每個(gè)數(shù)字中間用空格隔開(kāi)你多打了行尾空格有些判題系統(tǒng)會(huì)判錯(cuò)。題目要求保留兩位小數(shù)你丟掉了fixed和setprecision(2)錯(cuò)誤。題目要求“每個(gè)樣例輸出后跟一個(gè)換行”你漏了換行錯(cuò)誤。這些格式問(wèn)題在做題時(shí)往往因?yàn)椤斑壿媽?duì)了”而被忽略但判題系統(tǒng)是鐵面無(wú)私的。最好的辦法是在本地測(cè)試的時(shí)候嚴(yán)格按照題目描述的輸出格式確認(rèn)一遍甚至可以把樣例輸出復(fù)制過(guò)來(lái)直接對(duì)比字符數(shù)量。6. 從筆試結(jié)束到拿到面試復(fù)盤(pán)方法和后續(xù)規(guī)劃筆試交卷只是第一關(guān)70分以下簡(jiǎn)歷大概率沉底80分以上才有競(jìng)爭(zhēng)力這是大家心照不宣的分?jǐn)?shù)線(xiàn)。所以筆試結(jié)束后的72小時(shí)是復(fù)盤(pán)黃金期。不要急著對(duì)答案就完事一定要把每道題從頭到尾重新寫(xiě)一遍最優(yōu)解整理到自己的錯(cuò)題本里這樣下次同類(lèi)題就不會(huì)再慌。6.1 如何做一次高質(zhì)量復(fù)盤(pán)復(fù)盤(pán)的第一步是回憶并記錄自己當(dāng)時(shí)的三道編程題分別用了什么思路、卡在了哪里、耗時(shí)多久。第二步是查看??途W(wǎng)或討論帖里別人的解法注意對(duì)比時(shí)間復(fù)雜度和空間復(fù)雜度。第三步是思考是否可以?xún)?yōu)化暴力解法能不能用二分優(yōu)化二維DP能不能滾動(dòng)數(shù)組降維圖論題能不能用更短的最短路算法這里我建議你建立一份個(gè)人錯(cuò)題集按“題型—考點(diǎn)—錯(cuò)誤類(lèi)型—標(biāo)準(zhǔn)解法”四個(gè)字段整理。比如“動(dòng)態(tài)規(guī)劃—區(qū)間DP—狀態(tài)設(shè)計(jì)錯(cuò)誤—區(qū)間端點(diǎn)維度加左右位置狀態(tài)”。時(shí)間久了這份錯(cuò)題集就是你筆試備考最寶貴的資料。6.2 筆試后的24小時(shí)到48小時(shí)你該做些什么筆試結(jié)束后很多同學(xué)急著刷下一套題但我會(huì)建議先做另一件事把美團(tuán)歷年的筆試真題以及??途W(wǎng)上題單按考點(diǎn)分類(lèi)找到自己最薄弱的一類(lèi)做5道同類(lèi)型題鞏固。原因是筆試題目常有“換皮”的情況核心算法模型基本穩(wěn)定。如果這次在區(qū)間DP上栽了跟頭下次大概率還會(huì)出現(xiàn)類(lèi)似考點(diǎn)的題。與其廣撒網(wǎng)不如先精準(zhǔn)補(bǔ)漏。6.3 面試銜接筆試中暴露出的算法弱項(xiàng)會(huì)被面試追問(wèn)很多人以為筆試交卷后就能高枕無(wú)憂(yōu)其實(shí)面試官是可以看到你筆試成績(jī)的甚至?xí)槍?duì)性地追問(wèn)筆試題目。我當(dāng)時(shí)就被問(wèn)過(guò)“你說(shuō)說(shuō)這道題如果數(shù)據(jù)量再大十倍你打算怎么優(yōu)化”如果你只是過(guò)了一遍最優(yōu)解卻沒(méi)想過(guò)擴(kuò)展場(chǎng)景現(xiàn)場(chǎng)很容易卡殼。所以我的建議是筆試?yán)锏拿康李}至少要準(zhǔn)備一版優(yōu)化的思路。比如暴力枚舉的題想想怎么剪枝O(n^2)的DP想想能不能斜率優(yōu)化或者用數(shù)據(jù)結(jié)構(gòu)加速BFS想想能不能雙向BFS或A*搜索。不要覺(jué)得這是在浪費(fèi)時(shí)間面試場(chǎng)上你多答出這一層通過(guò)率能翻一倍不止。7. 備考美團(tuán)筆試我的最終建議清單最后給一份我基于實(shí)戰(zhàn)總結(jié)的備考清單希望對(duì)正在準(zhǔn)備美團(tuán)算法筆試的同學(xué)有實(shí)際參考價(jià)值。第一如果距離筆試還有一個(gè)月以上以系統(tǒng)刷題為主優(yōu)先吃透動(dòng)態(tài)規(guī)劃、貪心、圖論、字符串模擬、數(shù)據(jù)結(jié)構(gòu)棧、隊(duì)列、哈希、堆這幾大模塊。第二如果只剩兩周以真題和模擬題為主每天至少保證做三道完整編程題且一定要在ACM模式下寫(xiě)、在在線(xiàn)評(píng)測(cè)系統(tǒng)里交。第三如果只剩三天以復(fù)習(xí)模板和錯(cuò)題集為主不要再開(kāi)新題把DP、最短路、最小生成樹(shù)、并查集、二分答案、滑動(dòng)窗口這幾類(lèi)通用模板在本地編輯器里打一遍確保隨時(shí)都能調(diào)出來(lái)。我想特別強(qiáng)調(diào)一個(gè)很多人忽視的備考神器??途W(wǎng)的“筆試練習(xí)”模塊。你可以選公司和年份模擬真實(shí)筆試環(huán)境在線(xiàn)計(jì)時(shí)、在線(xiàn)提交、查看排名。一定要把自己放在真實(shí)的緊張感里來(lái)練習(xí)這不僅練技術(shù)也練心理。我第一次模擬的時(shí)候連輸入輸出都寫(xiě)錯(cuò)了但練了三次之后狀態(tài)就能穩(wěn)定下來(lái)。最后再說(shuō)一個(gè)心態(tài)問(wèn)題美團(tuán)筆試的題量不算少心態(tài)一崩后面全盤(pán)皆輸。我見(jiàn)過(guò)很多基礎(chǔ)不錯(cuò)的同學(xué)因?yàn)榍皟傻肋x擇題卡住影響了情緒導(dǎo)致后面編程題完全沒(méi)有狀態(tài)。我的建議是遇到卡殼的題先在草稿紙上寫(xiě)下“這題的考點(diǎn)是什么我現(xiàn)在該用什么策略”而不是一直盯著屏幕發(fā)呆。一旦從“怎么這么久還沒(méi)做出來(lái)”切換成“這題考的是圖論我用Dijkstra試試”大腦就會(huì)自然回到正軌。從準(zhǔn)備筆試到最終拿到面試機(jī)會(huì)整個(gè)過(guò)程其實(shí)是一場(chǎng)技術(shù)和心態(tài)的雙重修行。算法基礎(chǔ)決定了你的下限而考場(chǎng)上的時(shí)間分配、輸入輸出處理、狀態(tài)切換決定了你的上限。希望這份基于真實(shí)踩坑經(jīng)驗(yàn)的總結(jié)能讓你少走一些彎路愿大家都能穩(wěn)穩(wěn)拿下筆試順利走到面試環(huán)節(jié)。