景化算法與答題策略)
拼多多2018校招的技術(shù)筆試在當(dāng)年可以說(shuō)是“畫(huà)風(fēng)清奇”的存在。別的公司還在出“反轉(zhuǎn)鏈表”“求子數(shù)組最大和”這種經(jīng)典題型時(shí)拼多多直接扔出了一堆和業(yè)務(wù)場(chǎng)景強(qiáng)相關(guān)的應(yīng)用題比如多多的拼團(tuán)邏輯、優(yōu)惠券計(jì)算、物流路徑規(guī)劃。我當(dāng)年刷這套題的時(shí)候第一反應(yīng)是“這考的真是算法嗎”后來(lái)做多了才明白它考的是“用工程思維解決真實(shí)業(yè)務(wù)問(wèn)題”的能力。這份題匯總在求職圈流傳了很久幾乎成了準(zhǔn)備電商類(lèi)公司筆試的必刷清單。這篇文章不打算把每道題都貼一遍完整代碼那樣篇幅太長(zhǎng)而且網(wǎng)上已經(jīng)有很多現(xiàn)成答案。我更想站在一個(gè)過(guò)來(lái)人的角度把這套題里反復(fù)出現(xiàn)的題型、背后的知識(shí)點(diǎn)、容易踩的坑以及當(dāng)時(shí)我們幾個(gè)一起刷題的同學(xué)總結(jié)出來(lái)的答題策略完整地拆給你看。如果你正在準(zhǔn)備大廠校招尤其是電商、交易、物流方向的技術(shù)崗這篇文章應(yīng)該能幫你少走不少?gòu)澛贰?. 內(nèi)容整體設(shè)計(jì)與思路拆解1.1 這套題到底在考什么先給沒(méi)做過(guò)這套題的朋友掃個(gè)盲。拼多多2018校招編程題匯總網(wǎng)上能搜到的大概有十來(lái)道覆蓋了數(shù)組操作、字符串處理、動(dòng)態(tài)規(guī)劃、貪心算法、圖的遍歷、二叉樹(shù)這幾個(gè)經(jīng)典板塊。但它的“皮”和傳統(tǒng)ACM題完全不同——它把算法包裝在了一個(gè)個(gè)電商場(chǎng)景里。比如有一道題是“多多君在小區(qū)門(mén)口開(kāi)了一家水果店每天要配送水果到各個(gè)樓棟給定每個(gè)樓棟的需求量和距離求最短配送路徑”。這題剝掉外殼核心其實(shí)是圖論里的最短路徑或旅行商問(wèn)題的簡(jiǎn)化版。再比如有一道和“優(yōu)惠券疊加”有關(guān)的題本質(zhì)上是一個(gè)區(qū)間覆蓋或背包問(wèn)題的變體。我當(dāng)年第一次看到這些題最大的感受是題目描述特別長(zhǎng)信息密度特別高如果不快速提取關(guān)鍵條件很容易被繞進(jìn)去。而且很多題的時(shí)間復(fù)雜度約束很緊O(n^2)都不一定穩(wěn)過(guò)必須想清楚再動(dòng)手。為什么拼多多要這么出題我個(gè)人的理解是校招筆試不是單純篩“會(huì)不會(huì)寫(xiě)代碼”而是要篩“能不能把模糊的業(yè)務(wù)描述轉(zhuǎn)化成清晰的算法模型”。你將來(lái)進(jìn)公司要面對(duì)的需求絕大多數(shù)都不是“給你一個(gè)數(shù)組求最大值”這種句式而是“用戶領(lǐng)了一張滿100減20的券又參加了一個(gè)秒殺活動(dòng)結(jié)算時(shí)系統(tǒng)該怎么算錢(qián)”。能快速識(shí)別出“哦這是背包問(wèn)題”或“哦這是區(qū)間DP”比單純會(huì)背模板重要得多。1.2 準(zhǔn)備這套題的合理路徑如果你拿到這套題我不建議按順序從第一道刷到最后一道。更高效的做法是先把題目按考點(diǎn)歸類(lèi)然后集中突破。我當(dāng)時(shí)的分類(lèi)方法是這樣的純考基礎(chǔ)功的數(shù)組遍歷、字符串匹配、排序這類(lèi)題必須全對(duì)不能丟分。考算法模型的動(dòng)態(tài)規(guī)劃背包、區(qū)間DP、貪心、DFS/BFS、最短路徑這類(lèi)題占大頭需要重點(diǎn)練思路??即a實(shí)現(xiàn)細(xì)節(jié)的大數(shù)運(yùn)算、高精度、邊界條件處理這類(lèi)題不難但特別容易在細(xì)節(jié)上翻車(chē)。分類(lèi)之后你會(huì)發(fā)現(xiàn)這套題的核心難點(diǎn)就兩個(gè)一是從長(zhǎng)題干里抽取出數(shù)學(xué)/算法模型二是在限定時(shí)間內(nèi)寫(xiě)出無(wú)Bug的代碼。這兩件事都需要刻意練習(xí)。另外說(shuō)一句這套題雖然叫2018校招題但現(xiàn)在拿來(lái)練手完全不過(guò)時(shí)。因?yàn)榇髲S筆試的風(fēng)格有很強(qiáng)的延續(xù)性現(xiàn)在很多公司出的題依然能看到當(dāng)年那套題的影子。尤其是“場(chǎng)景包裝”這個(gè)思路幾乎是電商系公司出題的標(biāo)準(zhǔn)范式。2. 高頻考點(diǎn)與核心知識(shí)點(diǎn)拆解2.1 貪心算法看上去簡(jiǎn)單證明才是關(guān)鍵拼多多這套題里貪心算法出現(xiàn)頻率很高而且往往是那種“你覺(jué)得你對(duì)了其實(shí)你錯(cuò)了”的題。舉一個(gè)典型的例子多多的貨物裝車(chē)問(wèn)題——有一批貨物每件有重量和價(jià)值卡車(chē)有載重上限問(wèn)怎么裝能讓總價(jià)值最大。很多人一看就覺(jué)得是貪心按單位價(jià)值從高到低裝就行但這其實(shí)就是背包問(wèn)題貪心恰恰不保證最優(yōu)解。這類(lèi)題給我們的啟示是選錯(cuò)算法模型比不會(huì)做更可怕。因?yàn)檫x錯(cuò)之后你會(huì)沿著錯(cuò)誤的方向思考很久浪費(fèi)時(shí)間不說(shuō)最后交上去的代碼還是錯(cuò)的。我的經(jīng)驗(yàn)是只要題目里出現(xiàn)“最大價(jià)值”“最小成本”“最優(yōu)方案”這類(lèi)詞第一反應(yīng)不是去套貪心而是先問(wèn)自己三個(gè)問(wèn)題局部最優(yōu)能不能推導(dǎo)出全局最優(yōu)有沒(méi)有反例能推翻我的貪心策略這道題是不是應(yīng)該用DP尤其在考試環(huán)境下貪心算法的“證明”環(huán)節(jié)經(jīng)常被忽略。大家總覺(jué)得“看起來(lái)對(duì)就行了”但很多貪心策略的漏洞恰恰藏在看似理所當(dāng)然的細(xì)節(jié)里。如果你能快速舉出一個(gè)反例立刻轉(zhuǎn)DP往往是最優(yōu)解。2.2 動(dòng)態(tài)規(guī)劃從記憶化搜索到狀態(tài)壓縮動(dòng)態(tài)規(guī)劃是這套題的絕對(duì)主力。2018年的題里至少有三四道是DP的變體包括經(jīng)典的背包問(wèn)題、區(qū)間DP、狀態(tài)壓縮DP。我當(dāng)時(shí)刷題最大的體會(huì)是DP的難點(diǎn)不在寫(xiě)轉(zhuǎn)移方程而在定義狀態(tài)。狀態(tài)定義一旦對(duì)了轉(zhuǎn)移方程就是水到渠成的事?tīng)顟B(tài)定義錯(cuò)了后面全亂。以“多多君分糖果”這類(lèi)題為例具體題目是給不同權(quán)重的孩子分糖果要求滿足一定條件然后求最少糖果數(shù)如果你定義的狀態(tài)是“當(dāng)前分到第i個(gè)孩子當(dāng)前剩余糖果數(shù)j”那這個(gè)二維DP是能做的。但如果你把狀態(tài)定義成“前i個(gè)孩子已經(jīng)滿足條件的最小糖果數(shù)”就漏掉了“剩余糖果數(shù)”這個(gè)關(guān)鍵維度錯(cuò)誤地簡(jiǎn)化了問(wèn)題。這套題還特別喜歡考“區(qū)間DP”。區(qū)間DP的特征是你優(yōu)化的目標(biāo)是一個(gè)區(qū)間上的某種最優(yōu)值而且大區(qū)間的解依賴(lài)于小區(qū)間的解。常見(jiàn)套路是先枚舉區(qū)間長(zhǎng)度再枚舉區(qū)間起點(diǎn)然后枚舉分割點(diǎn)。我當(dāng)時(shí)整理過(guò)一個(gè)模板到現(xiàn)在還在用for (int len 2; len n; len) { for (int i 1; i len - 1 n; i) { int j i len - 1; dp[i][j] INF; for (int k i; k j; k) { dp[i][j] min(dp[i][j], dp[i][k] dp[k1][j] cost(i, j)); } } }這類(lèi)題的坑在于初始化。很多同學(xué)忘記把長(zhǎng)度為1的區(qū)間初始化好或者忘記把不可達(dá)狀態(tài)設(shè)成INF導(dǎo)致答案永遠(yuǎn)是0。這些小細(xì)節(jié)筆試的時(shí)候特別容易翻車(chē)。2.3 圖的遍歷與最短路徑場(chǎng)景包裝的重災(zāi)區(qū)拼多多2018校招題里有一類(lèi)題是“物流配送”“好友推薦”“拼團(tuán)關(guān)系鏈”——這些都是圖的典型場(chǎng)景。對(duì)算法基礎(chǔ)薄弱的同學(xué)來(lái)說(shuō)最大的障礙不是不會(huì)寫(xiě)B(tài)FS或Dijkstra而是看不出這是一道圖論題。給你一個(gè)場(chǎng)景“多多個(gè)用戶之間有關(guān)注關(guān)系如果A關(guān)注BB關(guān)注C那么C會(huì)出現(xiàn)在A的推薦列表里現(xiàn)在給定關(guān)注關(guān)系求某用戶的二度人脈列表”。這就是典型的BFS層次遍歷只是沒(méi)有直接給你鄰接矩陣或鄰接表而已。我當(dāng)時(shí)總結(jié)的經(jīng)驗(yàn)是題目里出現(xiàn)“關(guān)系”“網(wǎng)絡(luò)”“路徑”“可達(dá)”“最短”這些關(guān)鍵詞就要往圖的方向去想。實(shí)現(xiàn)的時(shí)候注意三點(diǎn)一是用鄰接表而不是鄰接矩陣省空間也省時(shí)間二是BFS要用隊(duì)列DFS要用?;蜻f歸不要搞混三是visited數(shù)組的標(biāo)記時(shí)機(jī)很關(guān)鍵——入隊(duì)時(shí)標(biāo)記和出隊(duì)時(shí)標(biāo)記會(huì)導(dǎo)致完全不同的結(jié)果。2.4 字符串與數(shù)學(xué)題細(xì)節(jié)是魔鬼這套題里有一批“不那么算法”的題比如大數(shù)相加、字符串循環(huán)移位、括號(hào)匹配、回文判斷等。這類(lèi)題看起來(lái)簡(jiǎn)單但想拿全分不容易。舉個(gè)大數(shù)相加的例子。題目會(huì)給你兩個(gè)特別長(zhǎng)的數(shù)字字符串讓你求它們的和。思路很簡(jiǎn)單從低位到高位逐位相加用一個(gè)變量記錄進(jìn)位。但我那次筆試這道題掛了很多人原因五花八門(mén)沒(méi)有處理長(zhǎng)度不同的情況短的字符串越界了。沒(méi)有處理最后一位的進(jìn)位比如991得到00而不是100。沒(méi)有處理結(jié)果前導(dǎo)零的問(wèn)題。這些問(wèn)題每一個(gè)單獨(dú)看都特別蠢但在考場(chǎng)那種緊張狀態(tài)下就是會(huì)犯。我后來(lái)養(yǎng)成了一個(gè)習(xí)慣寫(xiě)完代碼先跑三個(gè)用例——最小輸入、最大輸入、邊界輸入。最小輸入能暴露越界最大輸入能暴露超時(shí)和溢出邊界輸入能暴露進(jìn)位和特殊邏輯問(wèn)題。90%的代碼Bug都能靠這三類(lèi)用例查出來(lái)。3. 典型真題實(shí)戰(zhàn)解析3.1 真題一多多的排列計(jì)算題目描述大致是給定一個(gè)由數(shù)字1到n組成的排列按照字典序從小到大排列求第k個(gè)排列是什么??催^(guò)LeetCode的同學(xué)應(yīng)該知道這就是“第K個(gè)排列”。當(dāng)年這道題出現(xiàn)在拼多多的卷子里迷惑性極強(qiáng)——它看起來(lái)像是讓你把所有排列生成出來(lái)然后排序?qū)嶋H上n可能非常大全排列的復(fù)雜度根本過(guò)不了。正確做法是使用“階乘數(shù)系統(tǒng)”的數(shù)學(xué)方法。思路是這樣的最高位每固定一個(gè)數(shù)剩下的排列數(shù)就是 (n-1)! 個(gè)。所以我們可以通過(guò) k 除以 (n-1)! 來(lái)確定第一位數(shù)字然后更新 k 為 k % (n-1)!繼續(xù)確定下一位。我當(dāng)時(shí)寫(xiě)這道題的時(shí)候花了很多時(shí)間在“第k個(gè)”是從0開(kāi)始還是從1開(kāi)始的問(wèn)題上。如果用0-based索引k要減1如果用1-based直接用。我當(dāng)時(shí)選擇了一個(gè)最穩(wěn)妥的方案先把k做減一處理k--然后用0-based索引計(jì)算每一位。這樣處理起來(lái)邏輯最清晰也不容易出邊界問(wèn)題。這道題的核心考點(diǎn)其實(shí)有兩個(gè)一是階乘運(yùn)算會(huì)不會(huì)溢出n大于20的時(shí)候long long都不夠用所以必須用數(shù)組或字符串存儲(chǔ)結(jié)果二是二分的思想——每次用除法定位區(qū)間用取余更新目標(biāo)位置。這也是“按值定位”思想的經(jīng)典應(yīng)用。3.2 真題二多多的字符路徑這道題的原型是給定一個(gè)二維字符矩陣從某個(gè)起點(diǎn)出發(fā)每次只能走上/下/左/右四個(gè)方向不能走重復(fù)格子按順序收集字符拼成一個(gè)字符串求字典序最大的結(jié)果。剝掉外殼它是DFS回溯的典型題目而且涉及一個(gè)很重要的剪枝優(yōu)化如果當(dāng)前路徑的字典序已經(jīng)不可能超過(guò)已知最優(yōu)解就直接放棄。說(shuō)實(shí)話這道題當(dāng)年得分率很低因?yàn)樗袃蓚€(gè)關(guān)鍵難點(diǎn)。第一個(gè)難點(diǎn)是DFS的終止條件不好定——是要走到?jīng)]有可行的相鄰字符為止還是走固定步數(shù)第二個(gè)難點(diǎn)是“字典序最大”的全局性——你不能只貪心地每一步選最大的那個(gè)字符因?yàn)榭赡墚?dāng)前這步選了稍小的字符下一步能接到一個(gè)極大的字符整體字典序反而更大。我和同學(xué)討論之后一致認(rèn)為這道題最穩(wěn)妥的思路是先用DFS枚舉所有可達(dá)路徑然后用一個(gè)全局變量記錄最優(yōu)答案。如果n和m都很小比如不超過(guò)5這種暴力枚舉完全可行如果矩陣很大就需要加入剪枝比如記錄“當(dāng)前路徑字典序剩余最大可能字符”有沒(méi)有可能超過(guò)已知最優(yōu)解。這類(lèi)題給我最大的教訓(xùn)是不要一上來(lái)就寫(xiě)DFS先估算狀態(tài)空間。如果狀態(tài)空間在可接受范圍內(nèi)DFS暴力枚舉反而是最不容易出錯(cuò)的方案。反過(guò)來(lái)如果狀態(tài)空間很大又沒(méi)法剪枝那大概率是你理解錯(cuò)了題意。3.3 真題三多多的求和問(wèn)題這是一道典型的“數(shù)論二分”題目原題大意是給定一個(gè)數(shù)n求和為n的連續(xù)正整數(shù)序列的所有可能方案。比如n9時(shí)945也等于234所以答案是2。這道題其實(shí)有兩種主流解法。第一種是數(shù)學(xué)公式法連續(xù)序列的長(zhǎng)度為len起點(diǎn)為start那么 [(start (startlen-1)) * len] / 2 n。這個(gè)公式可以化簡(jiǎn)為 (2*start len - 1) * len 2n。于是問(wèn)題轉(zhuǎn)化為找一個(gè)len使得 2n 能被 len 整除且解出來(lái)的 start 是正整數(shù)。如果一個(gè)一個(gè)遍歷len時(shí)間復(fù)雜度是O(sqrt(n))完全可行。第二種是雙指針滑動(dòng)窗口法維護(hù)窗口[l, r]的和如果和小于n就右移r如果和大于n就左移l等于n時(shí)記錄答案。這種方法的時(shí)間復(fù)雜度是O(n)思路簡(jiǎn)單不容易出錯(cuò)。我當(dāng)時(shí)面試的時(shí)候用了滑動(dòng)窗口因?yàn)楣椒ǖ恼龡l件很容易漏解尤其是當(dāng)len是偶數(shù)的時(shí)候必須滿足 (2n/len - len 1) 是偶數(shù)這個(gè)條件特別容易搞混?;瑒?dòng)窗口雖然慢一點(diǎn)但勝在直觀可靠。筆試?yán)锓€(wěn)定拿分比追求最優(yōu)時(shí)間復(fù)雜度更重要。4. 常見(jiàn)問(wèn)題與答題技巧實(shí)錄4.1 時(shí)間不夠用怎么辦拼多多這套題總共的考試時(shí)間大概是90分鐘到120分鐘有四五道編程題。我當(dāng)年最大的感受就是時(shí)間根本不夠用。很多人掛在第一題上非要寫(xiě)出最優(yōu)解結(jié)果后面的題全空了。我的策略是先把所有題都快速看一遍每道題先寫(xiě)好暴力解或部分分的解確保每個(gè)用例都能過(guò)一部分。然后重新審視哪道題最有可能在剩余時(shí)間內(nèi)優(yōu)化出Full Score集中精力攻那一道。這套題是按用例給分的暴力解通常能拿40%到60%的分比空著強(qiáng)一百倍。注意考試系統(tǒng)一般有“編譯并測(cè)試”和“提交”兩個(gè)按鈕測(cè)試不扣分提交才計(jì)入成績(jī)。所以寫(xiě)完后一定要先測(cè)試再提交。別怕測(cè)試次數(shù)多就怕不測(cè)試直接交。4.2 輸入輸出格式的坑筆試題目看起來(lái)在考算法其實(shí)也在考你的輸入輸出處理能力。拼多多這套題里有幾個(gè)特別容易踩的輸入坑第一行給一個(gè)整數(shù)T表示有T組測(cè)試數(shù)據(jù)。很多同學(xué)只處理了一組。數(shù)組可能用逗號(hào)分隔而不是空格。你習(xí)慣性地用空格split直接就解析錯(cuò)了。輸入數(shù)據(jù)可能有多余的空格和換行不要用讀一行然后split的方式要用統(tǒng)一的tokenizer處理。我后來(lái)養(yǎng)成一個(gè)習(xí)慣每次筆試前先把IO模板準(zhǔn)備好。無(wú)論是“第一行是N第二行是N個(gè)數(shù)字”還是“多組輸入直到EOF”都直接復(fù)制模板不現(xiàn)場(chǎng)寫(xiě)。這個(gè)習(xí)慣幫我省下了大量時(shí)間。4.3 代碼的正確性驗(yàn)證方法就算你覺(jué)得代碼邏輯對(duì)也要學(xué)會(huì)自己構(gòu)造測(cè)試用例去驗(yàn)證。我最常用的是三類(lèi)用例最小用例比如n1、數(shù)組長(zhǎng)度為1能最快暴露越界和邏輯漏洞。最大用例比如n10^9看會(huì)不會(huì)超時(shí)、會(huì)不會(huì)溢出。反例構(gòu)造針對(duì)貪心或DP的策略專(zhuān)門(mén)構(gòu)造一個(gè)極端場(chǎng)景驗(yàn)證你的算法會(huì)不會(huì)算錯(cuò)。有一個(gè)經(jīng)驗(yàn)是所有“看上去很簡(jiǎn)單的題”都要特別小心。筆試題目里那些讀題只需要30秒的題往往藏著最深的坑。這種題不要求你算法多高深但你一旦大意就是整道題零分。4.4 筆試的答題順序怎么安排說(shuō)一下我總結(jié)的答題順序不一定適合所有人但值得參考。我的順序是先把所有題讀一遍大概估算每道題的難度和所需時(shí)間在草稿紙上標(biāo)好“先做”和“后做”。先做簡(jiǎn)單的字符串和數(shù)組題先把該拿的分都拿到穩(wěn)定軍心。再做數(shù)據(jù)結(jié)構(gòu)題比如二叉樹(shù)、鏈表相關(guān)。最后再做DP、貪心這類(lèi)需要長(zhǎng)時(shí)間思考和驗(yàn)證的題。這樣安排的核心邏輯是把“確定性高”的任務(wù)放在前面把“不確定性高”的任務(wù)放后面。因?yàn)榭荚囋降胶竺嫘膽B(tài)越容易崩把難題放最后即使沒(méi)做出來(lái)前面的分?jǐn)?shù)也夠了。5. 復(fù)盤(pán)這套題對(duì)現(xiàn)在的求職還有什么用5.1 為什么現(xiàn)在仍然值得刷其實(shí)距離2018年已經(jīng)過(guò)去了很久你可能覺(jué)得刷一套老題沒(méi)什么意義。但我的看法剛好相反校招筆試這塊技術(shù)棧和語(yǔ)言迭代很快但算法題的核心考點(diǎn)幾乎沒(méi)有變過(guò)。拼多多2018年出的這些題現(xiàn)在來(lái)看仍然是電商標(biāo)配的題型模板——字符串處理、DP、貪心、圖論、數(shù)學(xué)公式這些東西在任何一屆校招筆試?yán)锒际侵仡^戲。更重要的是這套題很好地訓(xùn)練了“長(zhǎng)題干閱讀能力”?,F(xiàn)在的筆試題目題干越來(lái)越長(zhǎng)場(chǎng)景包裝越來(lái)越花哨。如果你能靜下心把拼多多這些題啃下來(lái)再去做其他公司的題你會(huì)發(fā)現(xiàn)自己的信息提取速度快了一大截。5.2 從題目反推團(tuán)隊(duì)技術(shù)偏好從這套題里你還能看出一點(diǎn)有意思的東西拼多多的技術(shù)面試官很看重“業(yè)務(wù)落地能力”。那些和拼團(tuán)、物流、優(yōu)惠券相關(guān)的題目本質(zhì)上就是在暗示“我們公司就是做這個(gè)的我們希望招進(jìn)來(lái)的人能快速把技術(shù)應(yīng)用到真實(shí)業(yè)務(wù)上”。如果你在筆試之后的面試環(huán)節(jié)里能主動(dòng)把某道題和拼多多的實(shí)際業(yè)務(wù)場(chǎng)景做一個(gè)結(jié)合會(huì)是一個(gè)很加分的表現(xiàn)。我當(dāng)時(shí)在面試中被問(wèn)到“你做過(guò)最難的項(xiàng)目是什么”我特意提到了自己用DP優(yōu)化了一個(gè)配送路徑規(guī)劃的小項(xiàng)目面試官明顯來(lái)了興趣追問(wèn)了很多細(xì)節(jié)。雖然不是直接對(duì)應(yīng)筆試題目但這種“把算法和業(yè)務(wù)結(jié)合”的能力確實(shí)是拼多多這類(lèi)公司很看重的。5.3 延伸學(xué)習(xí)的建議如果你刷完這套題之后覺(jué)得不過(guò)癮可以從下面幾個(gè)方向繼續(xù)深入把題里出現(xiàn)的DP模型全部總結(jié)一遍包括背包、區(qū)間DP、狀態(tài)壓縮數(shù)字DP每類(lèi)找兩三道同類(lèi)題鞏固。把圖的BFS/DFS應(yīng)用場(chǎng)景熟悉一遍尤其是拓?fù)渑判蚝妥疃搪窂竭@些都是電商場(chǎng)景的高頻考題。把數(shù)論里常見(jiàn)的整除、取余、質(zhì)因數(shù)分解等知識(shí)點(diǎn)過(guò)一遍因?yàn)楹芏嗫此啤皵?shù)學(xué)題”的編程題本質(zhì)是在考這些基本功。我在刷完這套題后最大的收獲不是背住了某道題的解法而是建立了一個(gè)“業(yè)務(wù)場(chǎng)景→算法模型”的反射弧??吹健捌磫巍毕氲健胺纸M”看到“優(yōu)惠”想到“DP”看到“網(wǎng)絡(luò)”想到“圖”。這種反射弧需要大量刷題才能形成而拼多多的這套題恰好是一個(gè)很合適的訓(xùn)練場(chǎng)。5.4 最后一件事別只刷題要寫(xiě)博客復(fù)盤(pán)我個(gè)人經(jīng)驗(yàn)里最有效的刷題方式不是悶著頭一遍遍做題而是每做完一道有價(jià)值的題就寫(xiě)一篇博客記錄下來(lái)。寫(xiě)的時(shí)候你會(huì)自然地把題目的場(chǎng)景、解法思路、復(fù)雜度分析、易錯(cuò)點(diǎn)都過(guò)一遍這個(gè)過(guò)程比單純做題的收獲要大得多。很多知識(shí)你以為自己懂了但一寫(xiě)出來(lái)就發(fā)現(xiàn)邏輯順序是亂的。寫(xiě)博客、做輸出其實(shí)是在逼自己把“模糊的懂”變成“清晰的懂”。我當(dāng)年刷拼多多這套題的時(shí)候博客里記了好幾篇總結(jié)后來(lái)面試前翻一翻很快就能把高頻考點(diǎn)和代碼模板撿起來(lái)。這份東西到現(xiàn)在還留在我的筆記里偶爾溫習(xí)依然覺(jué)得很受用。