在競爭激烈的量化金融領域,Citadel 作為行業先鋒,一直吸引著大量優秀學生。對想拿 Software Development Engineer(SDE)實習的同學來說,Citadel SDE Intern OA 是通往夢校實習崗位路上的關鍵門檻。本文把這套 OA 最常見的三道題完整拆開講:題意、思路、複雜度、容易翻車的邊界。
一、Citadel Intern OA 概覽
| 維度 | 詳情 |
|---|---|
| 平台 | HackerRank |
| 題量 | 通常 3 道程式題 |
| 風格 | 模擬 + 字串 + 圖,重細節、重穩健性 |
| 難度 | 單題不算難,但條件多、易因理解偏差掉分 |
Citadel OA 的核心不是「會不會最優解」,而是「你寫的程式碼夠不夠穩、邊界處理得乾不乾淨」。
二、題 1:Price Check(價格核對)
一家商店用老式收銀機,價格靠人工輸入,偶爾出錯。給定商品列表及其正確價格,以及實際售出記錄和輸入價格,統計售價輸入錯誤的次數。
def priceCheck(products, productPrices, productSold, soldPrice):
# 建立 商品名 -> 正確價格 的映射
correct = dict(zip(products, productPrices))
errors = 0
for name, paid in zip(productSold, soldPrice):
# 浮點比較留容差,避免 2.89 != 2.8900001 的精度坑
if abs(correct[name] - paid) > 1e-9:
errors += 1
return errors
複雜度:時間 O(n + m),空間 O(n)。
邊界陷阱:價格是浮點數,千萬別用 == 直接比,要留 1e-9 容差;售出商品一定在商品表裡,但仍建議用 dict 而非線性查找,避免 O(n·m)。
三、題 2:Framing Text(文字加框)
給一個含多個單詞的字串,把每個單詞單獨佔一行,整體用矩形框包起來,單詞兩側各留一個空格。
例如 "Hello World in a frame":
+-------+
| Hello |
| World |
| in |
| a |
| frame |
+-------+
def print_boxed_text(input_str):
words = input_str.split()
width = max(len(w) for w in words) # 最長單詞決定框寬
border = '+' + '-' * (width + 2) + '+'
lines = [border]
for w in words:
# 左對齊補到統一寬度,兩側各一個空格
lines.append('| ' + w.ljust(width) + ' |')
lines.append(border)
return '\n'.join(lines)
複雜度:時間 O(總字元數),空間 O(同)。
邊界陷阱:框寬由最長單詞決定,短單詞要 ljust 左對齊補空格;頂部和底部邊框的 - 數量是 width + 2(含兩側空格),少算一個就對不齊。
四、題 3:Recommendation System(好友推薦)
社交應用的好友推薦原型:
n個用戶(0..n-1),m條好友關係。給用戶 y 推薦用戶 x 的條件是:x、y 還不是好友,且二者共同好友數最多。平手取索引最小者;沒有候選則輸出 -1。
from collections import defaultdict
def recommend(n, friendships):
adj = defaultdict(set)
for a, b in friendships:
adj[a].add(b)
adj[b].add(a)
result = []
for y in range(n):
best_user, best_mutual = -1, 0
for x in range(n):
if x == y or x in adj[y]:
continue # 跳過自己和已是好友的
mutual = len(adj[x] & adj[y]) # 共同好友數 = 鄰接集合交集大小
# 共同好友更多則更新;平手因 x 遞增遍歷,自動取最小索引
if mutual > best_mutual:
best_mutual = mutual
best_user = x
result.append(best_user if best_mutual > 0 else -1)
return result
複雜度:樸素 O(n²·d)(d 為平均度數)。
邊界陷阱:平手取最小索引——只要 x 從小到大遍歷、用嚴格 > 更新即可自動滿足;共同好友數為 0 時要輸出 -1,別誤推一個毫無關聯的用戶。
五、備戰節奏
| 重點 | 建議 |
|---|---|
| 模擬題 | 把題意條件逐條列清單,寫完對照核驗 |
| 字串格式題 | 注意對齊、邊框寬度,本地多跑幾組用例 |
| 圖論題 | 鄰接表/集合交集是高頻,練熟共同好友、連通分量 |
| 時間控制 | 單題別死磕,先 AC 再優化 |
FAQ
Q1:Citadel Intern OA 難度高嗎?
單題難度中等,但條件細、容錯低。掉分的人多半不是不會演算法,而是漏了一個邊界條件或浮點比較用了 ==。穩比快更重要。
Q2:浮點價格比較為什麼不能用 ==?
輸入和儲存可能有微小精度誤差,2.89 在浮點裡未必精確相等。用 abs(a-b) > 1e-9 判斷更穩,這是 Price Check 最常見的翻車點。
Q3:好友推薦題一定要最優解嗎?
不一定。n 不大時 O(n²) 集合交集就能過。重點是平手取最小索引、無候選輸出 -1 這兩個規則別寫錯。
Q4:OA 時間緊張寫不完怎麼辦?
三題按熟悉度排序,先把有把握的 AC,留細節充裕的題最後做。我們提供 OA 輔助 / OA 代寫:題型預測 + 限時陪練 + 即時給思路,幫你把會的穩穩拿下。
正在準備 Citadel SDE Intern OA?
這套 OA 考的是細節和穩健性,不是偏題怪題。如果你想要三題的限時陪練、量化金融公司 OA 的題型預測,或需要 OA 輔助 / OA 代寫 的即時對接,歡迎聯繫交流,發崗位 JD 先做題型拆解,再排練習計劃。
立即新增微信 Coding0201,獲取 Citadel OA 真題與陪練。
聯絡方式
- 微信:Coding0201
- Email:[email protected]
- Telegram:@OAVOProxy