這是一篇 失敗覆盤。我拿到 Citadel New Grad 的三輪 back-to-back video interview,題目其實都做出來了大半,最後卻掛在其中一輪——不是敗給演算法,而是敗給溝通。這篇不重點講題(三道題只做簡要說明),而是把鏡頭對準那輪翻車:一道不熟的原創題、一個全程冷漠的面試官、一場關於「資料該怎麼表示」的拉鋸戰,以及連面無休息的 2 小時 15 分對判斷力的消耗。如果你正在準備高強度連面,希望我的教訓能幫你少踩一個坑。
一、面試概覽
| 面向 | 詳情 |
|---|---|
| 入口 | 海投冷投,無內推、無 OA,履歷直接被撈進 screening |
| Screening | 45 分鐘,輕鬆,專案閒聊 + 幾道 BQ + 1 道回溯 |
| 正式面 | 三輪 back-to-back,共 2 小時 15 分,中間無休息 |
| 每輪結構 | 前半履歷 / BQ,後半演算法 coding,各約 45 分鐘 |
| 平台 | Citadel 自研 video + 編輯器一體平台,UI 乾淨,非 HackerRank / CoderPad |
| 結果 | 3–4 天後收到拒信 |
先說結論:Citadel 流程快、技術門檻高、題目貼近真實工作(模型設計、系統模擬、貪心)。但真正決定成敗的,是 你能不能在壓力下把一個不配合你的面試官帶進你的思路。
二、三道題(簡要)
1. Screening:排列等式回溯
把 1–9 填進 ABC、DEF、GHI 三個三位數,數字不重複,問有多少組滿足 ABC + DEF = GHI。9! 全排列暴力即可,輕鬆過,不展開。
2. 第一輪:DMV 任務分配(負載平衡)
每個員工有一個 multiplier 代表速度(multiplier=2 表示耗時翻倍),每個任務有 base duration(multiplier=1 的標準耗時)。員工序列化工作、任務不可拆分、由你決定分配,求完成所有任務的最短總時間。
典型 load balancing:任務按耗時從大到小排序,用最小堆維護每個員工的累積完成時間,貪心地把當前最大的任務塞給最空閒的員工(乘以其 multiplier)。這輪做對了。
import heapq
def min_time_to_finish(tasks, multipliers):
# tasks: 每個任務的 base duration 清單
# multipliers: 每個員工的速度倍率(值越大越慢)
# 堆裡存 (員工當前累積完成時間, 該員工倍率),初始都為 0
heap = [(0.0, m) for m in multipliers]
heapq.heapify(heap)
# 大任務優先分配,避免最後無處安放
for dur in sorted(tasks, reverse=True):
finish, mult = heapq.heappop(heap)
finish += dur * mult # 該員工做這個任務的實際耗時
heapq.heappush(heap, (finish, mult))
# 最晚完成的那個員工的時間 = 全部完成時間
return max(finish for finish, _ in heap)
if __name__ == "__main__":
# 3 個任務,2 個員工(倍率 1 和 2)
print(min_time_to_finish([4, 2, 3], [1, 2])) # 6.0
時間複雜度 O(n log m)(n 任務、m 員工);空間複雜度 O(m)。
3. 第三輪:字元版拓撲排序
輸入若干字元對(有向邊 A→B)與一個字元全集,輸出任意一個滿足全部先後約束的合法順序(類似 Alien Dictionary)。
建圖 + 入度表,Kahn 演算法(BFS)。這輪面試官很輕鬆,還一起聊了最佳化,體驗很好。
from collections import deque, defaultdict
def valid_char_order(pairs, chars):
# pairs: [(a, b), ...] 表示 a 必須排在 b 之前
# chars: 字元全集
graph = defaultdict(list)
indeg = {c: 0 for c in chars}
for a, b in pairs: # a -> b
graph[a].append(b)
indeg[b] += 1
# 所有入度為 0 的字元先入佇列
queue = deque(c for c in chars if indeg[c] == 0)
order = []
while queue:
c = queue.popleft()
order.append(c)
for nxt in graph[c]:
indeg[nxt] -= 1
if indeg[nxt] == 0:
queue.append(nxt)
# 若長度不足說明有環,無合法順序
return order if len(order) == len(chars) else []
if __name__ == "__main__":
pairs = [("a", "b"), ("b", "c"), ("a", "d")]
chars = ["a", "b", "c", "d"]
print(valid_char_order(pairs, chars)) # 例如 ['a', 'b', 'd', 'c']
時間複雜度 O(V+E);空間複雜度 O(V+E)。
三、翻車的那一輪:到底發生了什麼
第一輪和第三輪都順,問題出在中間那輪。覆盤下來,翻車是三件事疊加的結果:
1)題不熟,開場先慌了。 那是一道沒刷過的原創題,不是任何眼熟的模板。一上來我腦子空了幾十秒——而連面到這時已經過去一個多小時,沒休息,判斷力本就打了折。開場慌亂直接吃掉了後面本該用來 debug 的時間。
2)面試官冷,不給任何緩衝。 前兩輪面試官會順著我的話往下接,這輪的面試官全程面無表情、不給提示、不做引導。我拋出思路,對面沒有回饋,我無法判斷方向對不對,只能自己硬扛。
3)在「資料怎麼表示」上僵持太久。 我的思路其實可行——想用一種結構來存狀態。但面試官堅持要我換成另一種型別。我們在 representation 上來回拉鋸了很久,最後我硬著頭皮遷就他的型別。切換之後型別轉換把我繞暈,邏輯寫出 bug,等發現時已經沒時間 debug 了。
事後我幾乎能確定:我原來的方法是能跑通的。掛點不是演算法能力,是我 沒能在衝突裡既守住可行方案、又讓面試官願意跟著走。
四、給你的可操作建議
針對上面三個坑,我把教訓拆成能直接用的動作:
遇到不熟的題,先出聲、別默想。 沉默幾十秒對冷面試官是災難,對面只會覺得你卡住了。哪怕只是複述題意、列出輸入輸出、說「我先想暴力解再最佳化」,也要讓思考過程可見。把慌亂轉成結構化的自言自語。
面對冷場面試官,主動製造回饋點。 不要等他給提示。每推進一步就停下來確認一句:「我打算這樣存狀態,你覺得這個方向 OK 嗎?」把「他不給回饋」變成「我主動要回饋」。一個不表態的面試官,往往會在你直接提問時給出訊號。
遇到 representation 分歧,先問意圖、再決定要不要換。 當面試官堅持另一種型別時,別急著推翻自己、也別硬頂。先問一句:「你傾向這個型別是出於什麼考量?是後面有擴充,還是介面約束?」——理解他的意圖後,要麼發現他是對的、心服口服地換;要麼說明「我的結構也能滿足這點,能否讓我先按它寫,跑通再討論」。關鍵是別在沒搞清動機前就盲目遷就,盲目切換比堅持己見更危險——因為你會用一種你沒想清楚的表示去寫邏輯。
留出 debug 緩衝。 連面無休息、時間吃緊時,寧可方案樸素也要留下最後幾分鐘跑範例。一個能跑通的樸素解,遠勝一個漂亮但沒時間驗證的解。
一句話總結:在 Citadel 這種連面裡,演算法只是入場券,能不能帶著一個不配合你的人走完你的思路,才是真正的分水嶺。
五、連面節奏的備考建議
- 按真實節奏模擬。 找人陪你連做 2 小時以上、中間不休息,訓練疲勞狀態下的判斷力,而不是每題都精神飽滿地單獨刷。
- 刻意練「冷面試官 + 生題」。 讓陪練故意不給回饋、故意在 representation 上唱反調,逼你練出主動確認和據理力爭的肌肉記憶。
- 準備溝通話術範本。 「我先複述題意」「我打算這樣存,方向 OK 嗎」「你傾向這個型別是出於什麼考量」——把這些句子練到脫口而出,壓力下才用得出來。
- BQ 也別裸上。 每輪前半都有履歷 / BQ,「Why Citadel」「哪個專案讓你收穫最大」這類要提前想好。
FAQ
Q1:Citadel New Grad 一定要做 OA 嗎?
不一定。我這次是海投冷投、沒有內推,也沒做 OA,履歷直接被撈進 screening 電話。他們似乎會根據履歷挑一批人直接進流程,所以履歷品質很關鍵。
Q2:三輪 back-to-back 到底多累?
三輪共 2 小時 15 分,中間完全沒有休息,每輪約 45 分鐘(前半 BQ、後半 coding)。真正難的不是單題,而是連著做到第二、三輪時判斷力和溝通耐心的下滑——我翻車那輪正好卡在體力和注意力開始掉的時間點。
Q3:第二輪到底為什麼掛?是演算法不會嗎?
不是。題我大方向想對了,方法事後確認能跑通。掛點是:題不熟導致開場慌亂、面試官全程冷漠不給回饋、以及和他在資料表示上僵持太久。硬著頭皮換了型別後被型別轉換繞暈、邏輯出 bug、沒時間 debug。是溝通和臨場處理,不是演算法。
Q4:面試官堅持另一種資料表示時該怎麼辦?
先別急著推翻自己。問清他為什麼傾向那種型別(擴充性?介面約束?),理解意圖後再決定:要麼心服口服地換,要麼說明你的結構也能滿足需求、請求先按你的寫跑通再討論。最忌諱在沒搞清動機前盲目遷就,用一個自己沒想透的表示去寫邏輯。
Q5:Citadel 的題偏什麼方向?
貼近真實工作——模型設計、系統模擬、貪心策略,比如 DMV 任務分配負載平衡。也有偏標準的題如字元版拓撲排序、排列回溯。整體技術門檻高,但決定成敗的常常是臨場溝通。
正在準備 Citadel New Grad 連面?
Citadel 三輪連面強度大、節奏快,演算法之外,「冷面試官」「生題僵持」「表示分歧」這些臨場場景才最容易翻車。如果你想按真實連面節奏做一次高壓模擬,練一練主動確認、據理力爭和折中的話術,歡迎交流:發崗位 JD,我們先做題型預測,再排一套連面陪練計畫。
立即新增微信 Coding0201,獲取 Citadel 連面陪練方案。
聯絡方式
- 微信:Coding0201
- Email:[email protected]
- Telegram:@OAVOProxy