← 返回部落格列表 Citadel NG 三輪連面覆盤:一輪溝通卡關的教訓
Citadel

Citadel NG 三輪連面覆盤:一輪溝通卡關的教訓

2026-07-16

這是一篇 失敗覆盤。我拿到 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 這種連面裡,演算法只是入場券,能不能帶著一個不配合你的人走完你的思路,才是真正的分水嶺。

五、連面節奏的備考建議


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 連面陪練方案

聯絡方式