LeetCode 刷了四百題,還是卡在第一百零七題
幾乎每個沒過的故事裡都有同一個情節:那道題他寫過。雙指標的技巧他也知道。然後面試官說了一句「開始吧」,四十分鐘就消失在一個空白的編輯器裡。缺的不是練習,缺的是在被盯著的狀態下練習。
進了面試,到底變了什麼
在家寫題目,你是帶著全套裝備的:限制條件可以讀兩遍、範例可以往下捲、想法可以試一下再刪掉,刪掉的那一行沒有人看到。也沒有一個你感覺得到的計時器——卡住四分鐘,這四分鐘不用付錢。
面試裡全部反過來。卡住是看得到的,刪掉的那行是被看著刪的。而且你的注意力有一大塊,現在要用來揣測對面怎麼看你——這塊注意力就不在題目上了。
這不只是感覺,有人量過。2020 年北卡州立大學和微軟的研究者讓 48 名資工系學生解一道技術題,一部分在面試官面前用白板,一部分獨自待在房間裡;作者報告說,光是被人看著,表現就掉了一半以上。
這就是為什麼刷了四百題的人,還是會卡在第一百零七題。題目不是新的,條件是新的。
前六十秒決定了後面四十分鐘
大多數人一開始就動手打,因為沉默讓人覺得像失敗。這剛好是最差的一步:你在還沒看清楚輸入的形狀之前,就把自己綁在一個思路上;等到第二十分鐘發現不對,已經沒有時間回頭。
表現好的人把第一分鐘花在出聲講三件事:用自己的話複述題目、點出真正有作用的那個限制條件、說明你要最佳化的是什麼。「所以是要找出所有和為 target 的數對,陣列是排序好的,n 可以到十萬——那 O(n²) 就出局了。」
這一句話同時做到三件事:確認你聽懂題目;讓面試官看到你的推理是扣著限制條件走的;而且替你買到六十秒思考時間,而這段時間看起來是「有把握」,不是「僵住了」。
怎麼說「我還沒想到」又不輸掉這一場
卡住有兩種版本:一種會讓你沒過,一種不會。差別在於面試官看不看得到你卡在哪裡。
安靜地卡住是致命的。兩分鐘什麼都不說,看著你的人分不清你是在思考還是在溺水,於是預設是後者。
講出來的卡住能活下來,有時甚至加分。「暴力解很明顯是 O(n²)。我想用空間換時間,一直想往雜湊表靠——但還沒想清楚 key 要用什麼。」講到這裡,你已經告訴他:方向你有、取捨你懂,差的是具體的一步。面試官通常就在這時候給提示,因為你問的是一個真正的問題,而不是投降。
跟演算法完全無關的那一部分
去問任何一個面過一百場的人:同樣程度的兩個人,一個過一個沒過,差在哪裡?幾乎沒有人會回答「最佳解」。他們會講一些關於「這四十分鐘能不能跟這個人一起工作」的事。
他是在動手前就問邊界情況,還是被提醒了才問?第一個思路被推翻時,他是護著它,還是放掉它?拿到提示,他是接住往前走,還是跟你爭?
這些 LeetCode 上一題都沒有。而這些全都在評分表上。
怎麼練真正被考的那一半
繼續刷題,練的是你已經有的那一半。要練另一半,要改的是條件,不是數量。
一個人出聲解題,開著計時器。前十分鐘會覺得很蠢,之後就不會了。如果你對著空房間都講不出自己的推理,被陌生人看著時更講不出來。
然後拿已經寫過的題目重寫一遍,邊寫邊講。目標不是答案——答案你知道。目標是你思考的同時,嘴巴說出來的那句話。
三種翻車方式,各長什麼樣子
- 僵住。題目讀完了,腦袋裡什麼都沒來,沉默開始滾雪球:每一秒都讓下一秒更難,因為你現在還在想「我已經安靜多久了」。出路是機械式的,不是靠靈感——就算很丟臉,也先把暴力解講出來:「最直接的做法是列舉所有數對,O(n²),太慢,但我先從這裡開始再最佳化。」講出來的暴力解永遠勝過沉默,而且常常正是它把真正的解法帶出來,因為你已經動起來了。
- 押錯方向。第二分鐘鎖定一個思路,第二十五分鐘發現它處理不了重複元素,而跑道已經用完了。這一種要更早攔住:動手前講出你的思路依賴什麼假設——「這個做法要求元素不重複,這點有保證嗎?」面試官會告訴你,你也就避開了他埋的坑。
- 默默重寫。十分鐘後你發現結構錯了,於是全選、刪除。從外面看,這像慌了。講出來,它就變成判斷力:「這裡越寫越亂,是因為容器選錯了。我重來,改用 heap,兩分鐘。」同一個動作,完全相反的解讀。
真的沒看過這道題,怎麼辦
有時候題目真的很陌生,講再多也講不出那個技巧。這在很強的工程師身上也會發生,不代表一定沒過。
有用的是把「你怎麼面對一道沒看過的題目」示範出來,因為那才是真正的工作。從最小的輸入開始手算:寫出 n=1、n=2、n=3,看它們之間變了什麼。一邊做一邊講。規律從例子裡浮出來的次數,遠多於一直盯著題目看。就算這次沒浮出來,面試官也看到你在壓力下有紀律地往前推進——而這差不多就是他來看的東西。
真正會輸的答案,是有自信的捏造:一個聽起來像回事、其實跑不通的演算法,講的時候還毫不猶豫。面試官一驗證就垮,然後他會開始懷疑你講過的每一句話。
複雜度:別等人問
幾乎每一場程式面試最後都會有一句「複雜度是多少」——被問了才答,是一個很小但完全可以避免的損失。它傳達的訊號是:你寫的時候沒有在想代價。
邊走邊講。當你伸手拿雜湊表時,就把它換到了什麼、付出了什麼講出來:「這樣查詢是常數時間,代價是 O(n) 的額外空間——這裡值得,因為 n 很大,而記憶體不是瓶頸。」這樣一來,取捨就被記成「你做的決定」,而不是「你被逼著承認的事實」。
如果面試官問「還能更好嗎」,這通常不是陷阱,而是邀請。第一個反應最好是反問一句:要最佳化的是時間、空間,還是可讀性?這三者方向不一定一致,能出聲注意到這點,本身就是加分訊號。
Copilot 站在哪個位置
Interview Copilot 聽著這一關,面試官一講完問題,就把結構放到你的螢幕上:這道題真正在問什麼、哪個限制條件把某個思路排除掉了、值得講出來的取捨是什麼。它不是拿來照念的答案——照念答案,看著你的人一眼就看得出來。它是當腦袋空白的那一刻來臨、你自己的話還沒回來時,可以扶著開口的那個架子。
資料來源
- Behroozi, Shirolkar, Barik, Parnin — “Does stress impact technical interview performance?”, ESEC/FSE 2020 — 被人看著時表現掉了一半以上(48 名參與者)(查證於 2026-10-14)
- NC State University News — press release on the study (14 Jul 2020) — 這項壓力研究的新聞稿(查證於 2026-10-14)
- Meta Careers — Preparing for your software engineering interview at Meta — 技術初篩的形式和時間分配、45 分鐘的設計和行為面試、「邊想邊講」(查證於 2026-10-14)
- Google Careers — Interview tips — 可以複述和釐清問題,看重思路而非答案;Google 面試中不允許使用 AI(查證於 2026-10-14)
註:Google 的面試建議頁面寫明,面試期間不允許使用 Google 搜尋和 AI 工具。其他公司各有規定——在真正的面試中使用任何助手之前,先確認對方的規則。
FAQ
為什麼 LeetCode 刷了很多題,面試還是沒過?
因為面試考的是刷題練不到的東西:一邊解一邊講、接住提示、第一個思路失敗後怎麼收。這些和「一個人不限時間寫出正確解」是不同的能力。
遇到沒看過的題目該怎麼說?
直接講,然後從暴力解開始:「這題我沒看過,我先寫一個能跑的,再來最佳化。」這很正常,也在預期之內;假裝看過,通常的結局是沉默。
要不要不等人問就主動講複雜度?
要。在被問到之前講出「這裡是 O(n log n),因為排序;空間 O(n)」,既補上評分表上的一行,也說明你在想代價,而不只是在想輸出。
面試時緊張到腦袋空白,怎麼辦?
把出路變成機械動作,不要等靈感:出聲描述最直接的暴力解,就算它很笨。開口本身會讓思路重新動起來,而沉默只會讓下一秒更難。