通用崗第四批筆試復(fù)盤:題型、考點與備考策略)
2023年攜程春招技術(shù)通用崗第四批筆試提到攜程2023年春招技術(shù)通用崗的第四批筆試很多同學(xué)會在群里問這批題難不難和前面幾批比有什么變化我當(dāng)時也參與了這批筆試整體感受是難度中等偏上題量不小考察范圍比想象中要廣。它不僅僅考算法還會考你的計算機基礎(chǔ)、邏輯思維甚至對業(yè)務(wù)場景的理解。如果你正在準(zhǔn)備攜程的筆試或者想了解一下大廠春季招聘的通用技術(shù)崗到底在考什么這篇文章值得看完。我會盡量把題量、題型、知識點、備考建議都梳理清楚也把我自己踩過的坑和一些復(fù)盤后的想法寫出來。1. 筆試的基本盤題量、時長、平臺這些信息比想象中更重要很多人一上來就刷題忽略了最基礎(chǔ)的信息。但根據(jù)我自己的經(jīng)驗和周圍同學(xué)的反饋筆試能不能發(fā)揮好往往在你打開試卷之前就決定了一半。攜程的筆試一般是在??途W(wǎng)或者賽碼網(wǎng)進行2023年春招這批用的是牛客網(wǎng)全程監(jiān)控開啟需要共享屏幕這個細(xì)節(jié)要提前做好心理準(zhǔn)備。另外它的時長和題量分配需要特別注意因為題量真的不算小。1.1 題量與時長分配第四批筆試的時長是120分鐘題目的類型大致分為三部分選擇題、編程題、問答題。我記得選擇題大概有30道左右編程題3道問答題2道左右。聽起來好像不多但是如果你在選擇題上磨蹭太久后面編程題可能就沒有足夠時間了。需要注意的一個點是選擇題是單選和多選混在一起的多選選錯一個就整個不得分少選也會扣分。這一點很關(guān)鍵因為很多人按照做單選的慣性看到一個差不多對的選項就直接選了結(jié)果最后因為漏選或者誤選多選而失分。時間分配上我個人的建議是選擇題控制在50分鐘左右編程題每道20分鐘問答題留20分鐘。如果選擇題遇到卡殼的先標(biāo)記一下不要死磕因為你后面編程題的分?jǐn)?shù)占比往往是大頭。1.2 考試環(huán)境與編程環(huán)境這次筆試用的??途W(wǎng)編程題支持C、Java、Python等多種語言。環(huán)境上支持本地IDE但實際操作的時候很多同學(xué)反映本地調(diào)試和在線編輯器之間切換會浪費不少時間。我的建議是提前在??途W(wǎng)的模擬環(huán)境里練兩三次熟悉那個輸入輸出的處理方式特別是ACM模式也就是所有輸入輸出都得自己寫不是LeetCode那種核心代碼模式。這個差異很大。LeetCode你只需要寫函數(shù)體??途W(wǎng)的ACM模式你得自己處理輸入、那行的字符串解析如果預(yù)處理沒寫好可能整道題就卡住了。我記得當(dāng)時有同學(xué)就是因為輸入里有多余空格或者換行符導(dǎo)致本地測試沒問題但提交就是0通過率白白浪費了大把時間。1.3 通用崗與開發(fā)崗的差異這里還要說一句攜程的技術(shù)通用崗并不等同于純后端開發(fā)崗。它的筆試題目會更偏向于計算機基礎(chǔ)加邏輯思維的綜合考察而不會像專門的算法崗那樣三道題全是困難級別的數(shù)據(jù)結(jié)構(gòu)。即便如此你也不能掉以輕心因為它的題面可能不長但挖坑的地方不少。通用崗的定位是候選人進入公司后再細(xì)分方向所以筆試要篩的是你的計算機底子和邏輯能力而不是某一項專門的技能。因此你平時背的八股文很有用但光靠背也沒用它更看重你把知識用到實際場景里的能力。2. 選擇題的考察重心這些知識點是那批試卷里的高頻區(qū)選擇題部分大約30道題覆蓋范圍很廣。我復(fù)盤了一下主要分布在數(shù)據(jù)結(jié)構(gòu)、計算機網(wǎng)絡(luò)、操作系統(tǒng)、數(shù)據(jù)庫、Java或C語言特性還有幾道是純邏輯題。整體感覺是廣而不深但特別容易在細(xì)節(jié)題上翻車。它不會問你HashMap和Hashtable的區(qū)別這種爛大街的問題而是會用一段很簡短的代碼讓你判斷某個方法的輸出結(jié)果或者變量作用域的問題。2.1 數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)是重頭戲這批試卷里數(shù)據(jù)結(jié)構(gòu)的選擇題大概占了8到10道。印象比較深的是關(guān)于二叉樹遍歷的題目給出一棵樹的層序遍歷序列讓你推出它的先序遍歷。這種題其實不難但很多人會在紙上畫著畫著就亂了。我的經(jīng)驗是不要試圖把整棵樹畫完整而是直接用隊列的方式去反推或者干脆記住一個規(guī)律層序序列和其他遍歷序列互推時只需要關(guān)注子樹根節(jié)點的位置關(guān)系不用每次都完整畫樹。還有一個高頻考點是排序算法的穩(wěn)定性。這批題里考了快速排序、堆排序、歸并排序的穩(wěn)定性以及它們的時間復(fù)雜度分別是什么。這里有個容易混的點堆排序和快速排序都是不穩(wěn)定的但很多人憑印象以為快速排序是穩(wěn)定的。另外歸并排序是穩(wěn)定的這一點反而好記因為只要你聽到“歸并”這個詞想象它是在把兩個有序序列合并合并的時候保持前后順序不動那就自然是穩(wěn)定的。鏈表的操作也被考到了比如給定一個單鏈表讓你判斷刪除某個節(jié)點的時間復(fù)雜度是多少。這里的坑在于如果你只知道節(jié)點本身的引用不知道前驅(qū)節(jié)點那么在單鏈表里刪除這個節(jié)點其實是做不到O(1)的需要從頭遍歷找到它的前驅(qū)。但如果你要刪除的是頭節(jié)點或者已知前驅(qū)那就是O(1)。這種題目文字表述上稍改兩個字答案就完全變了讀題時千萬要圈出關(guān)鍵條件。2.2 計算機網(wǎng)絡(luò)和操作系統(tǒng)網(wǎng)絡(luò)這塊考了TCP三次握手、四次揮手的細(xì)節(jié)。問的是在四次揮手過程中TIME_WAIT狀態(tài)是由哪一方進入的以及為什么需要這個狀態(tài)。正確答案是由主動關(guān)閉連接的一方進入TIME_WAIT目的是保證最后的ACK能夠到達對方同時讓網(wǎng)絡(luò)中殘留的報文段過期失效。這種題目不偏但如果理解得不透徹很容易和TIME_WAIT導(dǎo)致的端口占用問題搞混。操作系統(tǒng)里進程和線程的區(qū)別幾乎必考但它的問法更偏向調(diào)度比如同一進程內(nèi)的多個線程共享什么不共享什么很多人只記住“共享地址空間、文件描述符不共享棧和寄存器”。但實際題目會用一種反向迷惑的方式問下列哪些是線程獨有的這就更考驗?zāi)銓Ω拍钸吔绲睦斫饬恕K梨i的條件也考了而且是選擇題里的一個明顯坑點。題目給出四個場景問哪些符合死鎖的四個必要條件?;コ狻⒄加胁⒌却?、不可剝奪、循環(huán)等待。這類題難度不大但我建議你把“循環(huán)等待”和“死鎖”區(qū)分開因為循環(huán)等待是死鎖的必要條件但不是充分條件這個點在一些選擇題里會被當(dāng)作干擾項。2.3 數(shù)據(jù)庫與SQL基礎(chǔ)知識數(shù)據(jù)庫的選擇題不算多大概3到4道但很實用。有一道題考了SQL語句的執(zhí)行順序問的是SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY這些子句中最先執(zhí)行的是哪個。答案是FROM因為要先確定表的數(shù)據(jù)范圍才能做篩選和聚合。很多人會直覺上認(rèn)為是SELECT先執(zhí)行因為它是寫在最前面的但其實SQL語句的書寫順序和邏輯執(zhí)行順序是兩回事。事務(wù)的ACID也是??汀K鼏柕氖鞘聞?wù)的持久性Durability主要由哪個機制來保證答案是Redo Log不是Undo Log。Redo Log負(fù)責(zé)崩潰恢復(fù)時重做已提交的事務(wù)Undo Log負(fù)責(zé)回滾未提交的事務(wù)。這兩個概念如果不在考前理清楚很容易在選項里犯迷糊。索引這塊的知識點在筆試?yán)锝?jīng)常結(jié)合場景出題。比如一個表有聯(lián)合索引(a, b, c)現(xiàn)在查詢條件是b? AND c?請問這個查詢會不會走索引答案是不會因為聯(lián)合索引遵循最左前綴原則查詢條件里沒有a索引就用不上。但這里有個小延伸如果查詢條件是a? AND c?那么a會走索引c就沒辦法走索引了。這類題目在選擇題里出現(xiàn)時往往會用“部分走索引”來作干擾項。2.4 語言特性和邏輯題Java和C語言特性大概占6到8道。Java考了String、StringBuilder、StringBuffer三者的區(qū)別以及final關(guān)鍵字的作用。C考了虛函數(shù)、指針和引用的區(qū)別。如果你是主攻Java的建議把JVM內(nèi)存模型再快速過一遍因為有一道題就是問堆、棧、方法區(qū)、程序計數(shù)器分別存儲什么。邏輯題大約4道左右它不涉及具體的計算機知識而是純智力題。我記得有一道是三個盒子只有一個盒子里有獎品每個盒子上寫著一句話只有一句話是真的問你獎品在哪個盒子里。這種題在考場上比較容易讓人緊張因為你要在一分鐘之內(nèi)判斷出來。我的經(jīng)驗是遇到邏輯題就先把題目中的命題寫清楚用表格或者排除法不要靠在腦子里空想往往很快就能出答案。3. 編程題復(fù)盤三道題里藏著哪些出題套路編程題是整場筆試的重頭戲。我看過不少同學(xué)的成績單選擇題錯得不多但編程題只有一兩道通過最終排名依舊不理想。這說明編程題的權(quán)重是非常高的。第四批筆試的3道編程題整體難度是階梯式的第一題相對簡單第二題是中等難度第三題就開始上強度了。3.1 第一道題數(shù)組處理與模擬考驗代碼基本功第一題一般是送分題但送分也并不是讓你直接白拿它考察的是代碼的熟練度和對邊界條件的敏感度。我記得題目大意是要統(tǒng)計一個數(shù)組中有多少個數(shù)能被它前面的一個數(shù)整除。這個題的暴力解法很簡單直接兩層循環(huán)就能過。但它對復(fù)雜度有一個溫和的限制如果你用O(n2)的暴力的確可以通過。但這里面有個陷阱輸入格式。題目給的是第一行一個整數(shù)n第二行是n個整數(shù)中間用空格分隔。如果你用Pythoninput().split()就能搞定但如果你用的是C用cin讀入的時候要注意換行符的問題。很多人在這個簡單題上卡了很久就是因為讀入讀錯了。這種題的關(guān)鍵是先想清楚邏輯再動手。特別是邊界條件比如n1時、數(shù)組元素為0時、負(fù)數(shù)時都要預(yù)先考慮到。你不要小看這個簡單題在實際考試的時候最快的同學(xué)5分鐘就AC了但最慢的同學(xué)可能20分鐘還在本地IDE里調(diào)輸入輸出。3.2 第二道題動態(tài)規(guī)劃或貪心考察狀態(tài)轉(zhuǎn)移的抽象能力第二題通常是一道中等難度的動態(tài)規(guī)劃。我印象里那道題很像“最長遞增子序列”的變體但多了一個限制條件你只能選取在原數(shù)組中不相鄰的元素。這意味著你不能簡單地用傳統(tǒng)LIS的轉(zhuǎn)移方式還需要考慮相鄰元素之間的限制。解題思路是這樣的設(shè)dp[i]表示前i個元素中滿足條件的最長序列長度。那么當(dāng)考慮第i個元素時有兩種情況選它或者不選它。如果不選它dp[i] dp[i-1]如果選它那么dp[i] dp[i-2] 1因為你必須跳過第i-1個元素。這里面的核心思路是“選或不選”的決策模型。你可以把它理解成打家劫舍的升級版本質(zhì)上就是二維決策的狀態(tài)機。這種題目在筆試?yán)锓浅3R姷奶茁肥桥白铋LXX子序列”外衣的動態(tài)規(guī)劃實際上考察的是你能否正確地定義狀態(tài)和狀態(tài)轉(zhuǎn)移方程。我的建議是在紙上先把狀態(tài)定義寫清楚再推轉(zhuǎn)移方程最后再寫代碼。很多同學(xué)一上來就動手寫循環(huán)寫了一半發(fā)現(xiàn)狀態(tài)沒定義好然后推倒重來白白浪費了時間。我在這道題上大約花了15分鐘其中前5分鐘完全是在紙上推演最后寫代碼只花了10分鐘一次通過。3.3 第三道題圖論或者復(fù)雜模擬區(qū)分度所在第三道題就比較有區(qū)分度了。我記得那道題有點像帶條件的最短路徑問題但它的狀態(tài)不是單純的二維坐標(biāo)而是需要額外記錄一個方向或者鑰匙狀態(tài)。這在圖論里屬于狀態(tài)壓縮BFS的范疇。狀態(tài)壓縮BFS的套路是把“狀態(tài)”定義為一個三元組(x, y, mask)其中mask是一個整數(shù)表示當(dāng)前收集到的鑰匙集合。每次移動時如果遇到鑰匙就更新mask如果遇到門就檢查mask里有沒有對應(yīng)的鑰匙。這樣可以保證同一個位置在不同鑰匙狀態(tài)下是不同狀態(tài)可以被分別訪問避免漏解。這道題讓我想強調(diào)的是不要因為題干長就害怕。圖論題往往題干越長信息越充分。你需要做的是把關(guān)鍵信息抽出來看看這幅圖里有哪幾種特殊節(jié)點比如鑰匙、門、起點、終點、障礙物。然后選擇對應(yīng)的算法。如果題目里出現(xiàn)了“鑰匙”“門”這兩個詞那大概率就是狀態(tài)壓縮BFS或DFS。填空題的量其實不大但它比較考驗綜合能力。我看到有同學(xué)在這道題上交了白卷很大原因是時間不夠了。所以我一定要強調(diào)時間的統(tǒng)籌。前面選擇題控制在50分鐘內(nèi)第一道編程題15分鐘第二道20分鐘第三道就算只能寫出部分通過率的解法也要先提交一版不要空著。4. 問答題與場景題大廠筆試?yán)锊豢珊鲆暤碾[形分除了選擇題和編程題這批筆試還包含問答題。很多人覺得問答題是主觀題分值可能不高或者閱卷比較隨意于是草草寫幾句了事。但我的經(jīng)驗是問答題恰恰是能體現(xiàn)你工程素養(yǎng)和思維深度的地方尤其對于通用崗來說面試官可能就通過你問答題的表述來判斷你有沒有工程思維。4.1 系統(tǒng)設(shè)計類型的主觀題這批問答題里有一道偏系統(tǒng)設(shè)計的題我記得大意是如果讓你設(shè)計一個酒店的庫存預(yù)訂系統(tǒng)你會怎么設(shè)計數(shù)據(jù)庫表結(jié)構(gòu)需要考慮什么并發(fā)問題這類題目在筆試?yán)锊怀R姷龅綍r千萬不要慌。它不需要你真的寫出一套完整的系統(tǒng)設(shè)計文檔而是考察你能不能把問題拆解成幾個關(guān)鍵的模塊房間庫存、訂單、用戶。你要在回答里展示出自己對于數(shù)據(jù)庫表設(shè)計的理解比如房間表、訂單表、庫存表分別如何設(shè)計主鍵外鍵是什么。更重要的是要結(jié)合并發(fā)場景說明在最壞情況下多個用戶同時預(yù)訂同一間房會出現(xiàn)什么情況怎么避免超賣。回答時我建議采用“總—分—總”的結(jié)構(gòu)先給出整體設(shè)計方案然后分模塊說明表結(jié)構(gòu)或者核心流程最后總結(jié)可能遇到的風(fēng)險以及解決的思路。這個結(jié)構(gòu)能讓你在有限的篇幅里讓面試官一眼就看到你的條理性。另外一個很重要但容易忽略的點是你的回答里要帶上“為什么”。很多人寫“我會給訂單表加一個狀態(tài)字段”但沒說為什么。如果你能補一句“加狀態(tài)字段是為了區(qū)分已支付、待支付、已取消等狀態(tài)在用戶支付回調(diào)時可以根據(jù)狀態(tài)字段做冪等處理”那得分就會高很多。4.2 開放式的場景題還有一道問答題更開放類似“如果線上系統(tǒng)出現(xiàn)某個接口特別慢你會怎么排查和處理”。這種題沒有標(biāo)準(zhǔn)答案它考察的是你排障的思路和知識面。我的回答思路是先確認(rèn)問題現(xiàn)象是接口普遍慢還是某幾個用戶慢是偶發(fā)慢還是一直慢??幢O(jiān)控CPU、內(nèi)存、磁盤IO、網(wǎng)絡(luò)帶寬先定位瓶頸在哪一層。查日志有沒有慢SQL、有沒有報錯、有沒有調(diào)用外部服務(wù)超時。如果定位到應(yīng)用層看有沒有死循環(huán)、頻繁GC、線程阻塞。如果定位到數(shù)據(jù)庫看有沒有全表掃描、鎖等待、索引失效。最后分析根因再講怎么優(yōu)化。這種回答并不需要你真的把問題解決掉而是要讓閱卷人看到你有一套排查問題的框架。很多同學(xué)遇到開放題會懵答案寫得很短甚至有點答非所問。我的建議是就算你是瞎猜的流程也要先寫“我首先會看XXX然后再看XXX”這種表達本身就體現(xiàn)了一種邏輯性。5. 復(fù)盤后的備考建議如果你也想沖攜程春招通用崗還有一條非常重要不要孤軍奮戰(zhàn)。找三五個同樣在準(zhǔn)備春招的同學(xué)組一個小群互相監(jiān)督刷題、互相改筆試復(fù)盤效果會好很多。特別是問答題你自己覺得寫得很清楚但旁觀者一看可能發(fā)現(xiàn)邏輯跳躍很大這種反饋在筆試前是非常有價值的。5.1 刷題方向要按題型分配不要盲目刷LeetCode很多人準(zhǔn)備大廠筆試就是悶頭刷LeetCode刷到500題就覺得自己穩(wěn)了。但攜程這批筆試給我的感覺是LeetCode幫助很大尤其是Hot 100里的經(jīng)典題但你還需要額外準(zhǔn)備基礎(chǔ)知識和問答題。如果你只刷LeetCode不刷選擇題到了考場上很容易在選擇題上栽跟頭。因為選擇題考的是知識廣度LeetCode練的核心是算法深度。我自己的安排是考前三周每天2~3道LeetCode保持手感其中動態(tài)規(guī)劃、BFS/DFS、雙指針、鏈表操作這四類題型是重點每天再花1小時專門過計算機基礎(chǔ)主要是數(shù)據(jù)結(jié)構(gòu)、計算機網(wǎng)絡(luò)、操作系統(tǒng)、數(shù)據(jù)庫這四個方向考前一天集中復(fù)習(xí)問答題的答題思路特別是系統(tǒng)設(shè)計和排障類的題目。5.2 模擬筆試很重要尤其是ACM模式如果你之前只在LeetCode上寫代碼到了牛客網(wǎng)的筆試環(huán)境一定會不習(xí)慣。原因很簡單LeetCode是函數(shù)式輸入??途W(wǎng)是標(biāo)準(zhǔn)輸入輸出你需要自己解析輸入。這個切換不是你看一眼就能適應(yīng)的必須通過模擬環(huán)境來練。方法很簡單去??途W(wǎng)的編程題題庫里找一些“公司真題”來做并且要求自己只用??偷脑诰€編輯器不打開本地IDE。開始的時候你可能會覺得在線編輯器很別扭但適應(yīng)了之后考場上就會順利很多。我在考前做了大概10套模擬題每套都嚴(yán)格按120分鐘限制自己到真實筆試的時候在線編輯器用起來已經(jīng)很順手了。5.3 編程題的調(diào)試技巧先打日志再找邏輯漏洞考場上時間緊編譯器又不像本地IDE那么好調(diào)試很多人一旦出了bug就開始瞎改代碼越改越亂。我自己的經(jīng)驗是遇到答案不對時不要急著改邏輯先打日志。在幾個關(guān)鍵節(jié)點輸出中間結(jié)果比如數(shù)組的某個狀態(tài)、循環(huán)的某個變量值看看它和預(yù)期是否一致。通常來說筆試編程題出錯無非三種情況邊界條件沒處理好比如數(shù)組越界、空輸入、n0或n1。狀態(tài)沒有初始化正確比如動態(tài)規(guī)劃的dp數(shù)組沒有賦值好。輸入解析問題比如讀取了多余換行、字符串分割錯誤。你通過日志能很快縮小范圍。如果打了日志還查不出來那就把代碼放一放先去看后面的題。不要在某一題上糾纏超過25分鐘這是筆試的大忌。有時候你換個角度回頭再來解反而一下就看出問題了。5.4 心態(tài)與技術(shù)同等重要這點放在最后說因為它真的會直接影響你的筆試結(jié)果。我記得第四批筆試當(dāng)天群里有人發(fā)消息說“選擇題好難”“編程題第二題就開始卡了”這些負(fù)面情緒很容易影響還在考試的同學(xué)。我當(dāng)時的做法是關(guān)掉手機不看考場外的任何消息按自己的節(jié)奏做題。筆試過程中一定會遇到不會的題這是正常的。不要因為一道題影響后面的發(fā)揮。選擇題不會就蒙一個編程題不會就寫暴力解法拿部分分問答題不會也要先把自己的思考路徑寫清楚。你要相信大部分人的體驗和你是相似的你要比的是誰在有限時間內(nèi)拿到的分更多而不是誰能完美解答所有題目。我在這批筆試?yán)镉袔椎李}也是半蒙半猜的但最后的成績依然能進入面試環(huán)節(jié)。這說明大廠筆試并不是要求你滿分而是看你的綜合排名。所以每道題都盡量寫一點東西交上去尤其是編程題哪怕只通過20%的用例也可能比空著交卷的人多出不少分?jǐn)?shù)。攜程春招技術(shù)通用崗的第四批筆試我當(dāng)時考完之后的最大感受是它不是一個“背題就能過”的考試而是一場綜合能力的篩選。選擇題考你的知識面編程題考你的代碼功底問答題考你的工程思維。三部分都不難但組合在一起如果想拿高分確實需要系統(tǒng)性的準(zhǔn)備。希望這篇文章能幫到你也祝你在攜程的春招里一切順利。