AI 程式設計面試題:範例與練習
作者 Aaron Cao · 更新於

請準備陣列、雜湊表、樹、圖、動態規劃及除錯相關題目。練習時,AI 可以提供提示、提出測試案例,並評論你的解說。你仍須自行驗證正確性與複雜度。只有在面試規則允許時,才能使用即時協助。
應先練習哪些程式設計面試題?
即使知道演算法名稱,面對新問題時仍可能不確定該如何著手。以下練習題會將具體輸入與解法選擇、複雜度界限,以及你應口頭說明的邊界情況連結起來。
- Two Sum:傳回兩個不同的索引,其值相加等於目標值。輸入為 [3, 3]、目標值為 6 時,答案會使用兩個位置。掃描時使用雜湊表記錄先前看過的值,在儲存目前值之前先檢查其互補值。這能避免重複使用同一個索引。預期時間為 O(n),額外空間為 O(n)。請釐清沒有配對時應傳回什麼。
- 找出沒有重複字元的最長子字串。對於 'abba',長度為 2。追蹤每個字元最後出現的位置,並維持一個沒有重複字元的視窗。若舊的出現位置位於目前視窗之外,左邊界絕不能往回移。使用雜湊表查詢時,預期時間為 O(n)。請釐清什麼算是一個字元。
- 合併重疊的閉區間。對於 [1, 3]、[3, 5] 和 [8, 10],傳回 [1, 5] 和 [8, 10]。先依起點排序,再延伸目前區間或開始另一個區間。排序使時間複雜度為 O(n log n)。共享端點的閉區間會重疊;請詢問這是否符合題目的定義。
- 反轉無環的單向鏈結串列。更改目前節點的下一個指標前,先儲存下一個節點。迭代解法需要 O(n) 時間和 O(1) 額外空間。逐步追蹤空串列、單一節點及兩個節點的情況。說明每次迭代後,串列的哪一部分已完成反轉。
- 逐層傳回二元樹的值。使用佇列,並在開始處理下一層之前,先處理目前層的節點數量。時間為 O(n);不計傳回的輸出,輔助佇列空間為 O(w),其中 w 是最大層寬。測試空樹,以及每層都只有一個子節點的樹。
- 根據先修條件判斷是否能完成所有課程。將先修條件建模為有向圖,並使用拓撲排序。若處理的頂點少於 V 個,表示仍有有向環。時間為 O(V + E)。測試不相連的元件、孤立課程及自我相依。
- 找出湊成某金額所需的最少硬幣數。假設正整數面額的硬幣數量不限。對於 [1, 3, 4] 和金額 6,優先選擇最大硬幣會使用三枚硬幣;3 + 3 則使用兩枚。將動態規劃狀態定義為各金額所需的最少硬幣數,並從金額零需要零枚硬幣開始。目標值為 A、面額數量為 c 時,標準方法需要 O(Ac) 時間和 O(A) 空間。請明確處理無法湊成的金額。
如需依職位和主題分類的相關練習,請瀏覽面試題庫。
解說完善的解法應該是什麼樣子?
請考慮這道題目:計算總和等於目標值的非空連續子陣列數量,並允許負數。對於 [1, -1, 1] 和目標值 1,答案為 3:可以是任一個只含 [1] 的單元素子陣列,也可以是整個陣列。
先從基準解法開始:選擇每個起始位置,再延伸結束位置,同時維持累計總和。這需要 O(n²) 時間和 O(1) 額外空間。常見的收縮視窗方法在此並不可靠,因為負數會破壞「延伸視窗會增加總和」的假設。
更快的方法會使用前綴和與頻率表。若目前的前綴和為 s,則每個等於 s - target 的較早前綴,都代表一個總和符合要求的子陣列。初始化頻率表時,加入一次前綴和為零的紀錄,用來代表陣列開始前的空前綴。
- 處理順序:先將目前值加入前綴和,計算相符的較早前綴數量,再記錄目前前綴。若先記錄,在目標值為零時就會錯誤地計入空子陣列。
- 不變量:記錄目前前綴之前,頻率表包含所有在目前位置之前結束的前綴頻率。
- 複雜度:每個元素會執行固定次數的頻率表操作。假設雜湊操作的預期時間為常數,預期時間為 O(n);額外空間為 O(n)。
- 檢查:空陣列傳回 0。對於 [0, 0] 和目標值 0,傳回 3。使用固定位元寬度的整數型別時,請考慮累計總和與答案計數的溢位。
一個實用的後續問題是:題目要求的是數量,還是實際的子陣列。傳回每個相符的子陣列會產生輸出成本:當目標值為零時,全零陣列會有 n(n + 1)/2 個相符的非空子陣列。
應如何使用 AI 練習程式設計題?
請先自行嘗試,再尋求協助,並要求能讓你繼續作答的最少介入。以下提示詞能將 AI 對話轉化為可自行檢驗的練習。
- 要求一個提示:請提示我應儲存哪些資訊。暫時不要提供程式碼,也不要說出完整演算法的名稱。
- 挑戰推理:這是我的迴圈不變量。請找出一個讓實作違反它的輸入,或說明每次更新為何都能維持它。請自行檢查回答;模型表示同意並不構成正確性證明。
- 稽核複雜度:請計算此實作中的切片、排序、容器操作及遞迴呼叫所執行的工作量。熟悉的演算法名稱無法證明實際程式碼的複雜度。
- 產生測試:請針對空輸入、重複值、邊界值及無解情況提出測試案例,並說明各自的預期答案。將這些答案當成測試判準前,請先獨立推導答案。
- 變更一項限制:若輸入已排序、不可修改,或以串流形式抵達,解法會如何改變?重寫程式碼前,請先說明新的取捨。
假設一名後端工程師正準備應徵雲端供應商的資深職位。解完先修條件圖問題後,她請 AI 練習夥伴提供一個含有環的不相連圖。接著,她在不查看提示的情況下追蹤佇列,並說明為何已處理的頂點數量能揭露該環。
閱讀完整解法後,請將它關閉,再憑記憶重建演算法、不變量和測試。能重現程式碼的重要性,不及能解釋其運作原因並因應限制變更調整解法。
若要練習在對話中說明你的推理,請前往模擬面試頁面。
SubcueAI 如何用於允許即時協助的程式設計面試?
SubcueAI 提供兩種即時協助介面。其主打的 macOS 和 Windows 原生應用程式會擷取系統音訊和你的麥克風,並在本機浮動覆疊層顯示協助內容。它支援桌面版會議用戶端,包括 Zoom 和 Microsoft Teams。
瀏覽器擴充功能也能透過 Chromium 瀏覽器的側邊面板提供即時協助,包括 Chrome 和 Edge。它只會擷取會議分頁的音訊,適用於 Google Meet 等瀏覽器分頁通話。它能透過該分頁聽見面試官的聲音,但絕不會擷取你的麥克風,也不會轉錄應試者的語音。Firefox 版本僅供模擬練習使用。
這兩種介面都不會將會議機器人加入通話,也不會把內容指令碼注入會議頁面。對於程式設計題,請區分口頭內容與書面內容:僅擷取音訊並不能取得只顯示在編輯器中的題目敘述或程式碼。請根據確切的題目、限制和實作檢查任何建議。
使用即時協助前,請先確認面試規則。SubcueAI 並非在所有情況下都無法被偵測。螢幕共享、錄影、受監考的評量,以及公司管理的裝置,均不在隱蔽性保證範圍內。共享或錄製的畫面可能顯示覆疊層或側邊面板,而裝置或監考控制措施也可能監控活動。
如需可用介面的設定指南,請參閱 SubcueAI 教學。