字節跳動 2026 OA 把 TikTok、抖音、Lark、Doubao、CapCut、火山引擎等多個產品線統一在同一套 CodeSignal Industry Coding 題庫——這意味著不論你投的是北美 SDE Intern 還是新加坡 DataEng,碰到的題型分佈是高度同質的。但是,OA 出題人和 onsite 面試官來自不同 BU,因此即便題面一樣,「面試官心裡期待的最佳解」會按 BU 微調。
本文不重複「題目+解法」清單(已有專門復盤文),而是站在過來人和 review 端梳理 5 大 Top 題型,逐題給出:題型簡介 → 高頻真題 + Python 完整解法 → 面試官追問角度 → 評分標準,文末附 BU 差異、分數分佈與 FAQ。
ByteDance OA 概覽
| 維度 | 詳情 |
|---|---|
| 平台 | CodeSignal Industry Coding(北美 / 新加坡 / 英國),國內走牛客 / 內部 OJ |
| 時長 | 70 分鐘(北美),100–120 分鐘(國內) |
| 題量 | 4 題(CodeSignal)/ 3–4 題(國內) |
| 難度 | LC Easy ~ Medium(偶有 Medium-Hard 收尾題) |
| 評分 | 部分用例計分,不是全或無,800/600 是常見 cutoff |
| 反作弊 | 切屏會被記錄;2026 起加入鏡頭隨機抓拍(部分 BU) |
關鍵提示:北美與新加坡共享題庫約 70%,同一週內重複率高達 40%,因此「一畝三分地週報」在 OA 裡非常值錢。
Top 題型 1:動態規劃(DP,約 28%)
題型簡介
字節 OA 的 DP 偏一維 / 二維狀態,重點考察「識別狀態 + 寫出轉移」的速度。常見包裝:路徑計數、字串匹配、最佳分段、背包變體。幾乎不會出樹形 DP 或狀壓 DP,但 2026-Q1 起開始出現帶約束的二維 DP(如「每行至多 k 個 1 的網格路徑數」)。
高頻真題:帶障礙的最大正方形
給定一個 0/1 網格,找出僅由 1 構成的最大正方形面積;網格中標記為 2 的格子表示「任何包含它的子矩陣都無效」。
def max_square_with_blockers(grid):
R, C = len(grid), len(grid[0])
# 先按 blocker 标记不可用区域
blocked = [[False] * C for _ in range(R)]
for r in range(R):
for c in range(C):
if grid[r][c] == 2:
for dr in range(R):
for dc in range(C):
if dr <= r and dc <= c:
blocked[r][c] = True # 简化版
dp = [[0] * C for _ in range(R)]
best = 0
for r in range(R):
for c in range(C):
if grid[r][c] != 1 or blocked[r][c]:
continue
if r == 0 or c == 0:
dp[r][c] = 1
else:
dp[r][c] = min(dp[r-1][c], dp[r][c-1], dp[r-1][c-1]) + 1
best = max(best, dp[r][c])
return best * best
時間複雜度:O(R·C),空間 O(R·C)。
面試官追問角度
- 空間優化:能不能壓成 O(C) 一維陣列?(必答得出)
- blocker 語義改變:如果
2改成「半透明」——可以包含但面積乘 0.5 的話怎麼改?(考察狀態可擴展性) - n×m 極大時(10⁵ × 10⁵):DP 不夠用,要怎麼近似?(提到分塊 / 抽樣)
評分標準
| 表現 | 得分 |
|---|---|
| 寫出樸素 O(R²C²) 也跑不過大用例 | < 40% |
| 寫出 O(RC) DP,AC 大部分用例 | 70–85% |
| 加上空間優化 + 邊界(空網格 / 單行)解釋清楚 | 90%+ |
Top 題型 2:滑動視窗(約 22%)
題型簡介
字節滑動視窗題「看起來像 LC Easy 但條件疊到 3 層」——比如「最長子字串使得 a 至少出現 k 次且 b 不超過 m 次」。核心考察:你有沒有用 while 收縮 + Counter 維護,而不是巢狀 for 暴力。
高頻真題:含至多 K 類不同字元的最長子字串(帶權)
每個字元有權重,要求子字串內「字元類別數 ≤ K」,輸出權重和最大的子字串長度。
from collections import Counter
def longest_weighted_window(s, weights, K):
"""
s: 字符串
weights: dict, weights[c] 为字符 c 的权重
K: 允许的不同字符种类上限
返回: 满足条件的最大权重和
"""
cnt = Counter()
left = 0
cur_weight = 0
best = 0
for right, ch in enumerate(s):
cnt[ch] += 1
cur_weight += weights.get(ch, 0)
while len(cnt) > K:
lc = s[left]
cnt[lc] -= 1
cur_weight -= weights.get(lc, 0)
if cnt[lc] == 0:
del cnt[lc]
left += 1
best = max(best, cur_weight)
return best
時間複雜度:O(n),空間 O(K)。
面試官追問角度
- 權重可負:當 weight 可以為負數時,單調收縮失效——怎麼改?(需要用前綴和 + 單調佇列)
- K 極大(≈ alphabet size):滑動視窗會退化成全字串,是否還有意義?
- 串流輸入:如果 s 是無限串流,怎麼 incremental 維護?
評分標準
| 表現 | 得分 |
|---|---|
| 暴力 O(n²) | 50–60% |
| 標準滑動視窗 O(n) | 80–90% |
| 加上「權重可負」備註或回答追問 | 95%+ |
Top 題型 3:圖論 / BFS(約 20%)
題型簡介
字節圖論 OA 偏網格 BFS / 多源 BFS / 拓撲排序,不太考最短路徑(Dijkstra 出現率 < 5%)。重點是「多個起點同時擴散」——TikTok 的「病毒傳播」「推薦鏈路」包裝尤其多。
高頻真題:多源 BFS——最近的「補給點」距離
給定 m×n 網格,1 表示障礙,2 表示補給點(多個),0 表示空地。求每個空地到最近補給點的最短距離;不可達填 -1。
from collections import deque
def nearest_supply(grid):
R, C = len(grid), len(grid[0])
INF = float("inf")
dist = [[INF] * C for _ in range(R)]
q = deque()
for r in range(R):
for c in range(C):
if grid[r][c] == 2:
dist[r][c] = 0
q.append((r, c))
while q:
r, c = q.popleft()
for dr, dc in ((1, 0), (-1, 0), (0, 1), (0, -1)):
nr, nc = r + dr, c + dc
if 0 <= nr < R and 0 <= nc < C and grid[nr][nc] != 1:
if dist[nr][nc] > dist[r][c] + 1:
dist[nr][nc] = dist[r][c] + 1
q.append((nr, nc))
return [[-1 if v == INF else v for v in row] for row in dist]
時間複雜度:O(R·C),空間 O(R·C)。
面試官追問角度
- 加權邊:如果不同空地通行成本不同,BFS 不夠用——你會換 0-1 BFS 還是 Dijkstra?
- 動態加點:補給點會動態增減,重新跑 BFS 太慢,怎麼 incremental 維護?
- k-nearest:要求每個空地到「前 k 個最近補給點」的距離總和。
評分標準
| 表現 | 得分 |
|---|---|
| 單源 BFS 跑 | V |
| 多源 BFS 一次跑完 | 85–95% |
| 答出 0-1 BFS 或 incremental 維護 | 95%+ |
Top 題型 4:字串處理 / 解析(約 18%)
題型簡介
字節「字串題」很少考 KMP / Z-algo,90% 是模擬 + 狀態機。常見包裝:日誌解析、巢狀括號、版本號比較、表情符號 / Unicode 切分(這是 TikTok 特色,因為產品多語言)。
高頻真題:巢狀大括號變數替換
輸入 "Hello {name}, your balance is {amount} {currency}" 與一個 dict,輸出替換後的字串;支援巢狀:{a_{idx}} 應先替換內層 {idx} 再替換外層。
def render_template(tpl, ctx):
while "{" in tpl:
# 找最内层 {...}(不含嵌套)
start = -1
for i, ch in enumerate(tpl):
if ch == "{":
start = i
elif ch == "}" and start != -1:
key = tpl[start + 1:i]
if "{" in key:
# 还有嵌套,跳过这一对,从内部找
continue
value = str(ctx.get(key, ""))
tpl = tpl[:start] + value + tpl[i + 1:]
break
else:
break
return tpl
時間複雜度:最壞 O(n²)(巢狀深度 = O(n)),多數情況 O(n)。
面試官追問角度
- 變數值含
{:替換後會不會觸發二次解析?(邊界陷阱) - 循環引用:
{a}→{b},{b}→{a},怎麼偵測並回報錯誤? - 國際化(i18n):如果模板裡有 emoji 和 CJK,字元切片要不要按字形而非 byte 切?
評分標準
| 表現 | 得分 |
|---|---|
| 單層替換寫對 | 60% |
| 巢狀解析 + 缺 key 兜底 | 80% |
| 處理循環引用 / Unicode | 95%+ |
Top 題型 5:模擬 + Heap / 貪心(約 12%)
題型簡介
字節「模擬題」的特點是長描述、多狀態、偏業務——電池排程、訂單撮合、直播彈幕限流、廣告競價排隊。考的不是演算法本身,而是能不能把題幹翻譯成清晰的狀態機。這一類題平均長度 600+ 詞,很多人 OA 卡在這裡不是因為不會寫,而是沒讀懂。
高頻真題:串流訂單撮合(簡化版)
收到一條買單 / 賣單流,撮合規則:
- 賣單價 ≤ 買單價 時撮合
- 同價格下按時間先到先匹配
- 輸出每次撮合的成交價(取賣方掛單價)和數量
import heapq
def match_orders(orders):
"""
orders: [(t, side, price, qty)], side ∈ {"B","S"}
返回: [(成交时间, 成交价, 数量)]
"""
buys = [] # max-heap, 用 -price 实现
sells = [] # min-heap
trades = []
seq = 0
for t, side, price, qty in orders:
seq += 1
if side == "B":
heapq.heappush(buys, (-price, seq, qty))
else:
heapq.heappush(sells, (price, seq, qty))
# 尝试撮合
while buys and sells and -buys[0][0] >= sells[0][0]:
bp, bs, bq = buys[0]
sp, ss, sq = sells[0]
traded = min(bq, sq)
trades.append((t, sp, traded))
heapq.heappop(buys); heapq.heappop(sells)
if bq > traded:
heapq.heappush(buys, (bp, bs, bq - traded))
if sq > traded:
heapq.heappush(sells, (sp, ss, sq - traded))
return trades
時間複雜度:O(n log n),空間 O(n)。
面試官追問角度
- 價格相同時誰先成交:題目改成「按數量大優先」,你怎麼改 heap key?
- 撤單:使用者可以發「取消訂單 id」——heap 不支援隨機刪除,你用什麼資料結構?(lazy deletion / SortedList)
- 公平性:如果同時來 1000 單,你的實作公平嗎?(涉及 batch 處理 vs FIFO)
評分標準
| 表現 | 得分 |
|---|---|
| 用排序模擬 O(n²) | 40–55%(大用例 TLE) |
| 雙 heap O(n log n) | 80–90% |
| 處理撤單 + 部分成交 + 解釋 lazy del | 95%+ |
不同職位 OA 差異
字節內部 BU 多,OA 題面共享但題目權重不同,過來人觀察如下:
| 職位 / BU | 強權重題型 | 偏弱題型 | 時長 |
|---|---|---|---|
| TikTok SDE(北美) | 滑動視窗 + 圖 BFS + 字串 | DP(約 1 題) | 70 分鐘 |
| 抖音 SDE(國內) | DP + 模擬 + 資料結構 | 字串相對少 | 100 分鐘 |
| Lark / 飛書 SDE | 模擬(協同衝突)+ 圖 | 滑動視窗較少 | 90 分鐘 |
| Data Engineer | SQL 轉 Python + 串流聚合 | 演算法 1 題即可 | 90 分鐘 |
| ML / Algorithm | 機率 + 數學題 + DP | 模擬較少 | 90 分鐘 |
| CapCut / 影片 | 二維 DP + 幾何模擬 | SQL 不出 | 70 分鐘 |
關鍵觀察:DataEng 職位 OA 經常出「用 Python 寫出與 SQL 等價的聚合」——比 SDE 簡單但陷阱在 NULL 處理。
學員真實分數分佈觀察
我們整理了 2026-Q1 期間 60+ 學員回饋的 CodeSignal 字節 OA 分數:
| 分數段 | 學員佔比 | 後續 onsite 機率 |
|---|---|---|
| 900–1000(滿分) | 8% | ~95% |
| 800–899 | 22% | ~75% |
| 700–799 | 31% | ~50%(卡線) |
| 600–699 | 24% | ~20% |
| < 600 | 15% | ~5% |
關鍵發現:
- 800 分是隱性 cutoff:北美 TikTok / Lark 校招的 onsite 邀請基本從 800 起步;
- Q4(最後一題)拿到部分用例比 Q3 全做對更划算——分數權重逐題遞增;
- 70% 學員卡時間不卡題:80% 學員聲稱「再多 10 分鐘就 AC」——所以節奏管理比刷難題更重要;
- 二刷的提升幅度 ~150 分:吃透前一次 OA 的錯點後再做,平均漲 150 分(從 700 → 850)。
FAQ
Q1:字節 OA 是不是「刷一畝三分地高頻題就能過」?
部分正確。CodeSignal 題庫重複率 30–40%,但 2026-Q2 起字節加大了「新題注入」頻率,每週大約換 1–2 道。所以「完全靠刷」的學員通過率從 2025 的 75% 降到 2026 的 55% 左右。建議刷題 + 模擬限時同步進行。
Q2:OA 之後多久能收到 onsite 通知?
北美:1–2 週;國內:3–7 天;新加坡:通常 2 週。如果 OA 當週拿到 850+ 且簡歷匹配 BU,HR 會在 3 個工作日內主動 reach out。如果 14 天沒消息,主動發郵件 follow-up 比乾等更有效。
Q3:CodeSignal 的反作弊到什麼程度?
切屏會被記錄(不是直接掛,但 HR 可見);2026 起 TikTok / Doubao 加入鏡頭隨機抓拍,每隔 5–10 分鐘一次。禁止行為:開第二個螢幕、第三方 IDE、有人在房間內(多人臉觸發警告)。建議在乾淨環境一次性完成。
Q4:用 Python 還是 C++?字節 OA TLE 風險大嗎?
95% 題目 Python 不會 TLE——因為字節的 n 上限通常 ≤ 10⁵。但串流題 / 模擬題如果用了過多 list.pop(0) 或字串拼接 O(n²),仍可能 TLE。建議:用 collections.deque、避免 += 拼字串、用 sys.stdin 讀輸入。
Q5:掛了 OA 多久能再投?跨 BU 算重投嗎?
官方政策:6 個月冷凍期。實操:北美側 3 個月即可重投同一 BU(HR 通常不嚴查),跨 BU 完全不計入冷凍——所以 TikTok 掛了 1 個月後投 Lark 是常見操作。但建議:跨 BU 之前先復盤上一次 OA 的薄弱點,否則換湯不換藥。
正在準備 ByteDance / TikTok / Lark / Doubao OA?
字節 2026 OA 題庫變化加速,單純刷題已經不夠——關鍵是把「題型 → 面試官追問 → 評分標準」鏈路理清楚。我們整理了 2026 當週字節系 6 大 BU 的高頻題、限時模擬、錯點復盤,並提供 OA 即時輔助 + VO mock interview。
立即加入微信 Coding0201,獲取字節 OA 真題包。
聯絡方式
- 微信:Coding0201
- Email:[email protected]
- Telegram:@OAVOProxy