TikTok(字節跳動海外)2026 OA 題量大、題面長、IDE 樸素,對 Python 寫法效率的要求遠高於其他公司。同樣的演算法,用 Python 標準庫寫 8 行 vs 自己 hand-roll 50 行,在 110 分鐘限時下能直接決定能否做完。
本文專注一個角度——Python 寫法。我們不再重複「110 分 7 題」概覽(已有專文),而是聚焦 TikTok CodeSignal IDE 內的 Python 工具鏈、模板程式碼、常見 timeout 來源,再附 6 條 FAQ。如果你最近已經做過幾道 LC Medium 但 OA 總卡 Q5/Q6 寫不完,這篇能幫你提速 30% 以上。
CodeSignal Industry Coding Framework 平台特點
| 維度 | 詳情 |
|---|---|
| 平台 | CodeSignal Industry Coding Framework(不是 GCA) |
| 時長 | 110 分鐘,7 道題(Q1-Q4 漸進,Q5-Q7 獨立) |
| Python 版本 | 3.10+(已支援 match-case、structural pattern matching) |
| 內建庫 | sortedcontainers、numpy、pandas 都有裝 |
| IDE 配色 | 淺色 / 深色可切,無 vim mode |
| 自動補全 | 僅基礎變數補全,無類型推斷 |
關鍵資料:TikTok 官方提供給 candidate 的 Python 環境裝了
sortedcontainers——這意味著你寫 SortedList / SortedDict 不需要自己實作。但 90% 的 candidate 不知道這一點。
Python 工具鏈清單(含版本)
# 這些都是 TikTok CodeSignal 預設裝的——不需要 import 之外的任何配置
from collections import defaultdict, deque, Counter, OrderedDict
from heapq import heappush, heappop, heapify, nsmallest, nlargest
from itertools import combinations, permutations, product, accumulate, groupby, pairwise
from functools import lru_cache, cache, reduce, cmp_to_key
from bisect import bisect_left, bisect_right, insort
from sortedcontainers import SortedList, SortedDict, SortedSet # ← 重點
import math, statistics, re
最容易被忽略的兩個工具:
itertools.pairwise(iterable)— 3.10+ 內建,省掉zip(arr, arr[1:])sortedcontainers.SortedList— O(log n) 插入 + 索引存取,可 [i] 隨機存取
Q1-Q4:漸進題型 Python 模板
TikTok Q1-Q4 多是「4 級漸進」或「5 級漸進」題——一個資料結構題面,逐級加約束。Python 寫法關鍵是面對面用 SortedList / dict 處理 Level 3+。
典型 Q1-Q4:評分系統(來自 2026-03 真題)
題面:實作一個評分管理系統。
- Q1:
add_rating(user, score)/get_rating(user) - Q2:批次
top_k(k)查詢當前評分前 k 高使用者 - Q3:加
decay_at(ts)時間衰減(每過 1 單位時間,所有評分 × 0.9) - Q4:加
rollback(ts)回到指定時間戳前的狀態
from sortedcontainers import SortedList
class RatingSystem:
def __init__(self):
self.scores = {}
self.sl = SortedList()
self.history = []
def add_rating(self, user, score):
if user in self.scores:
self.sl.remove((-self.scores[user], user))
self.history.append((len(self.history), user, self.scores.get(user), score))
self.scores[user] = score
self.sl.add((-score, user))
def get_rating(self, user):
return self.scores.get(user, 0)
def top_k(self, k):
return [user for _, user in self.sl[:k]]
def decay_at(self, ts):
for u in list(self.scores):
old = self.scores[u]
new = old * 0.9
self.sl.remove((-old, u))
self.scores[u] = new
self.sl.add((-new, u))
def rollback(self, ts):
while self.history and self.history[-1][0] >= ts:
_, user, old, _ = self.history.pop()
cur = self.scores.get(user)
if cur is not None:
self.sl.remove((-cur, user))
if old is None:
self.scores.pop(user, None)
else:
self.scores[user] = old
self.sl.add((-old, user))
關鍵點:
SortedList的[:k]是 O(k),比手寫 heap「彈 k 次再回填」快 3-5 倍- 用
(-score, user)把最大堆轉成最小堆(SortedList 是升序) decay_at不需要重排——所有元素同時 × 0.9 不改變相對順序
Q5-Q7:獨立難題 Python 模板
Q5-Q7 題型獨立,常考:
| 題型 | Python 關鍵工具 |
|---|---|
| 區間合併 / 掃描線 | sorted(events) + heapq |
| 字串模式匹配 | re.finditer + lru_cache |
| 圖最短路徑 | heapq + defaultdict(list) |
| 滑動視窗 + 中位數 | SortedList + bisect |
滑動視窗中位數模板
from sortedcontainers import SortedList
def sliding_median(nums, k):
sl = SortedList(nums[:k])
res = []
for i in range(k, len(nums) + 1):
if k % 2 == 0:
mid = (sl[k // 2 - 1] + sl[k // 2]) / 2
else:
mid = sl[k // 2]
res.append(mid)
if i < len(nums):
sl.remove(nums[i - k])
sl.add(nums[i])
return res
時間複雜度:O(n log k)
TikTok 加分項:直接用 SortedList 而不是 hand-roll 雙堆。面試官 review 程式碼時會覺得你知道 Python 生態——這是 TikTok 評估「工程素養」的暗號之一。
三類常見 Python TLE 陷阱
陷阱 1:用 list.pop(0) 當佇列
# ❌ O(n²) 會 TLE
q = list(range(100000))
while q:
x = q.pop(0)
# ✅ O(n)
from collections import deque
q = deque(range(100000))
while q:
x = q.popleft()
TikTok Q3 經常構造 10⁵-10⁶ 量級資料,pop(0) 直接超時。
陷阱 2:在迴圈裡用 + str 拼接
# ❌ O(n²)
s = ""
for c in arr:
s += c
# ✅ O(n)
s = "".join(arr)
OA 題目裡 build 輸出字串很常見,這一行可能讓你少做一題。
陷阱 3:誤用 lru_cache 處理 mutable 參數
# ❌ list 不可雜湊,會報 TypeError
@lru_cache
def solve(arr, k):
...
# ✅ 轉 tuple
@lru_cache
def solve(arr_tuple, k):
...
solve(tuple(arr), 3)
TikTok DP 題在 Q5-Q6 經常出現,lru_cache 是常用利器。
CodeSignal IDE 配置技巧
| 設定 | 推薦 |
|---|---|
| 字體大小 | 16px(高 DPI 筆電用 14) |
| Tab 寬度 | 4 spaces |
| 配色 | Solarized Dark(CodeSignal 自帶) |
| 自動儲存 | 預設開啟,不需要 Ctrl+S |
| 測試執行快捷鍵 | Cmd/Ctrl + Enter |
重要:CodeSignal 的「Run Tests」按鈕是軟測試——只跑可見 case。Submit 之後才會跑 hidden test,且只能 submit 一次。先點 Run Tests 幾次,確認核心邏輯無誤再 Submit。
110 分鐘時間分配建議
Q1: 5 min (read + code, easy)
Q2: 10 min (extend Q1)
Q3: 15 min (state addition)
Q4: 25 min (history / rollback)
Q5: 20 min (independent medium)
Q6: 25 min (independent hard)
Q7: 5 min (often skip if Q5/6 timeout)
buffer: 5 min
重要建議:Q7 不一定要做——TikTok 評分模型對 Q5-Q6 全過 + Q7 不答 vs Q1-Q7 都答但 Q6 錯的 candidate,前者通過率更高。
FAQ
Q1:TikTok 的 CodeSignal 平台和 Meta 的有什麼區別?
平台都是 CodeSignal,但 Meta 用 General Coding Assessment (GCA)——2 題 70 分鐘純演算法。TikTok 用 Industry Coding Framework——7 題 110 分鐘,前 4 題強制漸進。兩個題庫完全不通用。
Q2:Q1-Q4 漸進題如果 Q3 沒過,Q4 還會出現嗎?
會出現。CodeSignal 題面是預先解鎖的——Q3 沒過不影響 Q4 顯示。但 Q4 的程式碼必須在 Q1-Q3 基礎上擴展,所以 Q3 錯了 Q4 大概率也錯。正確策略:直接讀 Q4 後再決定 Q3 怎麼寫——預先看到 rollback 需求,Q3 就會知道要存 history。
Q3:Python 用 PyPy 還是 CPython?
CodeSignal Python 預設是 CPython 3.10+——沒有 PyPy 選項。如果擔心超時,要麼改用 C++/Java,要麼用 numpy 把內層迴圈向量化。字節跳動內部偏好 Go,但 OA 階段沒有任何加分。
Q4:sortedcontainers 一定要會嗎?
強烈建議會。90% 的 TikTok Q3-Q4 都涉及「維護有序集合 + 頻繁查 top-k」,沒有 SortedList 你要麼手寫紅黑樹(不現實),要麼用 heap + 懶刪除(出 bug 機率高)。SortedList 學習成本 < 30 分鐘,極高 ROI。
Q5:TikTok OA 通過後多久 onsite?
2026 cycle 平均 5-10 天通知 onsite,節奏比 Meta / Google 快很多。**部分職缺(Recommendation / Search Algo)**會在 OA 後插一輪 Tech Phone Screen,再進 onsite。
Q6:題目裡有 OOP 設計需求時,Python 用 dataclass 還是普通 class?
普通 class。dataclass 在 Q4 rollback 題型下反而麻煩——你要手動寫 __deepcopy__。普通 class + dict 存欄位是 TikTok candidate 的主流寫法。
正在準備 TikTok / 字節跳動 OA?
CodeSignal Industry Coding Framework 難點不在演算法本身,而在 110 分鐘內用 Python 寫出健壯的 4 級漸進程式碼。我們整理了 TikTok 2025-2026 20+ 套真題模擬 + Python 模板,並按「漸進題 / 獨立題 / 設計題」三類輸出系統化訓練計畫。
立即加微信 Coding0201,取得 TikTok OA 模擬題包。
聯絡方式
Email: [email protected] Telegram: @OAVOProxy