DSA面試題
作者 Aaron Cao · 更新於

DSA面試反覆用到一小組固定模式,而不是成百上千道各不相同的題目。常見考點包括陣列與字串、雙指標與滑動視窗、雜湊、二分搜尋、樹與圖、堆積,以及動態規劃,而且都是需要你邊解題邊講解思路的即時問題。
DSA面試到底在考什麼?
你已經寫過幾百題,卻還是覺得沒準備好,這通常代表你練習的是錯誤的那一半。本節說明面試到底在考什麼,讓練習方向對上。
一場即時的資料結構與演算法面試會同時考查四件事:你能不能認出題目屬於哪種模式、能不能在寫程式前說清楚思路、實作在邊界情況下是否正確,以及能不能用口語說明複雜度。許多候選人只優化第三點、忽略第二點,結果一個正確卻沒有解釋的答案反而被扣分。
辨識這一步,正是模式練習勝過刷題數量的原因。題目很少是全新的,大多是既有模式的重新組合。一旦你能在頭一分鐘內說出這是在頻率映射表上做滑動視窗,剩下的就只是執行。依語言與職缺分類的相關題庫,見面試問題庫。
你需要掌握哪些模式?
這些模式涵蓋了大部分常見考題。要學會辨識指向每種模式的訊號。
- 雙指標。已排序輸入、兩數之和、原地分割、迴文檢查。
- 滑動視窗。在限制條件下求最長或最短的連續子陣列。
- 雜湊表計數。字母異位詞、重複元素、頻率比較、第一個不重複元素。
- 二分搜尋。已排序陣列,以及陣列未排序時在答案空間上做二分。
- 廣度優先與深度優先搜尋。樹、網格、連通元件、無權重最短路徑。
- 堆積與優先佇列。前 k 大問題、合併已排序資料流、動態求中位數。
- 區間問題。依起點排序後進行合併、插入與重疊偵測。
- 動態規劃。重疊子問題:爬樓梯、找零錢、編輯距離、子序列問題。
- 回溯。排列、組合、子集合、限制類謎題。
- 圖論演算法。拓撲排序、聯集查找、帶權重最短路徑。
依主題劃分,會問到哪些問題?
以下是面試官常用措辭給出的代表性題目:
- 在陣列中找到兩個總和為目標值的數,然後不使用額外空間實作。
- 回傳不含重複字元的最長子字串長度。
- 給定一個旋轉排序陣列,在對數時間內找到目標值。
- 合併重疊區間,並說明為什麼排序這一步是值得的。
- 反轉一棵二元樹,然後求出它的最大深度。
- 驗證一棵二元搜尋樹,並說明簡單粗暴的檢查會漏掉什麼。
- 統計網格中島嶼的數量,然後說明當網格大到記憶體放不下時該怎麼處理。
- 找出出現頻率最高的 k 個元素,並說明你選擇該資料結構的理由。
- 計算湊出某個金額所需的最少硬幣數,並寫出遞迴關係式。
- 偵測鏈結串列中是否存在環,然後回傳環的起始節點。
- 對一棵二元樹進行序列化與反序列化。
- 給定課程的先修關係,判斷該課程安排是否可行。
一位應徵後端職缺的社會新鮮人拿到子字串問題後立刻開始打程式。程式碼幾乎是對的,但面試官整場都在追問這段程式在做什麼,最終的評分反映的是這份沉默,而不是那個小 bug。另一位候選人花四十秒說出在字元映射表上滑動視窗,遇到重複就收縮左邊界,同時記錄最大值,就已經通過了最難挽回的那部分。
如何練習邊解題邊講解?
常見問題
DSA面試前應該練多少題?
涵蓋這些模式比刷題數量更重要。能辨識並實作上述每一種模式、並用口語講清楚的人,比默默刷了更多題的人準備得更充分。
大多數面試都要求熟悉動態規劃嗎?
動態規劃確實經常出現,但它只是眾多模式中的一種,很少構成整場面試。熟悉陣列、雜湊、樹和圖,比把動態規劃擺在最優先更有用。
我該不該在沒人問的情況下主動說明複雜度?
應該。在提出思路時說明時間與空間複雜度,做完後再說一次,這會被視為完整答案的一部分,而不是加分項目。
如果我找不到最佳解怎麼辦?
直接說明這一點,實作你已經想到的可行方案,並說明它為什麼不是最佳解。一個正確答案配上誠實的複雜度說明,比沉默地苦苦尋找理想解得分更高。
AI 助手能在 DSA 面試環節中提供協助嗎?
只有在該環節是即時口語對話時才可以,即便如此,錄音、螢幕分享或監考也會排除這種可能。瀏覽器內的打字測驗不在適用範圍內,貼上程式碼還會觸發相似度偵測。