← 返回部落格列表 Citadel SDE Intern OA 全解析:Price Check + Framing Text + 好友推薦三題拆解
Citadel

Citadel SDE Intern OA 全解析:Price Check + Framing Text + 好友推薦三題拆解

2026-06-04

在競爭激烈的量化金融領域,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 真題與陪練

聯絡方式