最近帶學員刷了一套 ByteDance Online Assessment,平台是 CodeSignal,和大家熟悉的 Uber / Roblox / HRT / TikTok 通用題庫很像,整體模式是 70 分鐘 4 題。如果你之前做過這些公司的 OA,遇到的題型和套路基本一致。難度不算爆炸,但想在 70 分鐘內全 AC,還是得提前熟悉 CodeSignal 的題型,尤其是那些容易掉的邊界和 corner case。
一、OA 結構總覽
| 項目 | 內容 |
|---|---|
| 平台 | CodeSignal(通用題庫,近 Uber/Roblox/HRT/TikTok) |
| 模式 | 70 分鐘 4 題 |
| 難度 | 中等,重點在準確率 + 時間管理 |
| 易失分點 | 邊界 / corner case |
二、Problem 1:城市天際線中的最大正方形
題目
cityline 陣列每個元素是一棟樓的高度,寬度都是 1,沿路緊貼排列無間隙。求這排樓裡能容納的最大正方形面積。
示例:cityline = [1, 2, 3, 2, 1] → 輸出 4(可容納多個 2×2,再大放不下)。
思路
邊長為 k 的正方形能放下 ⟺ 存在連續 k 棟樓,高度都 ≥ k。邊長越大越難滿足,具有單調性,可二分邊長,每次 O(n) 判定:
def solution(cityline: list[int]) -> int:
n = len(cityline)
def can_fit(k: int) -> bool:
run = 0 # 連續 >= k 的樓數
for h in cityline:
run = run + 1 if h >= k else 0
if run >= k:
return True
return False
lo, hi, best = 1, min(n, max(cityline)), 0
while lo <= hi:
mid = (lo + hi) // 2
if can_fit(mid):
best = mid
lo = mid + 1
else:
hi = mid - 1
return best * best # 面積 = 邊長²
複雜度 O(n log n)。陷阱:邊長上界是 min(樓數, 最高樓),別只用 n 或只用最大高度。
三、Problem 2:近似規則十字計數
題目
矩陣中,一個十字(cross)由某一行和某一列相交構成。若十字上所有元素相等,稱為規則十字;若除了行列交點處那個元素外其餘都相等,稱為近似規則十字(nearly regular)(規則十字也算近似規則)。求矩陣中近似規則十字的總數。
要求複雜度不差於 O(R·C·(R+C))。示例矩陣輸出 10。
思路
對每個交點 (r, c),十字 = 第 r 行 + 第 c 列(去掉重複的交點)。「除交點外全相等」意味著:行上除 c 外所有元素相等,列上除 r 外所有元素相等,且這兩個公共值相等。預處理每行 / 每列「去掉某一列 / 某一行後是否同值、同值是多少」即可:
def solution(matrix: list[list[int]]) -> int:
R, C = len(matrix), len(matrix[0])
def line_profile(values):
# 返回 (公共值, 允許作交點的例外索引集合)
from collections import Counter
cnt = Counter(values)
if len(cnt) == 1:
return values[0], set(range(len(values))) # 全相等,任意位置可當交點
if len(cnt) == 2:
(v1, c1), (v2, c2) = cnt.most_common()
if c2 == 1: # 只有一個異類,它必須是交點
idx = values.index(v2)
return v1, {idx}
return None, set()
row_prof = [line_profile(matrix[r]) for r in range(R)]
col_prof = [line_profile([matrix[r][c] for r in range(R)]) for c in range(C)]
total = 0
for r in range(R):
rv, r_ok = row_prof[r]
if rv is None and not r_ok:
continue
for c in range(C):
cv, c_ok = col_prof[c]
# 行在 c 處可作交點、列在 r 處可作交點、且兩公共值相等
if c in r_ok and r in c_ok and rv == cv:
total += 1
return total
複雜度 O(R·C)(預處理 O(R·C)),優於題目要求。陷阱:交點元素本身可以任意;只有「非交點」需要等於公共值。
四、Problem 3:最優字串翻轉
題目
給定字串 word,你可以通過反轉開頭或結尾的若干字元來生成新串。反轉前 k 個字元:|w₀…wₖ₋₁|wₖ… → |wₖ₋₁…w₀|wₖ…;反轉後 k 個字元同理作用於尾部。目標是通過這些操作得到字典序最小的字串。
思路
前綴反轉 / 後綴反轉都是局部 reverse,關鍵是貪心選擇能讓字典序變小的操作。實戰中先實現「枚舉所有前綴 / 後綴反轉,取字典序最小」的基線,再討論多次操作的可達集:
def best_reversal(word: str) -> str:
best = word
n = len(word)
for k in range(1, n + 1):
prefix_rev = word[:k][::-1] + word[k:] # 反轉前 k
suffix_rev = word[:n - k] + word[n - k:][::-1] # 反轉後 k
best = min(best, prefix_rev, suffix_rev)
return best
陷阱:注意 k 的取值範圍(1..n)和「反轉後 k」的切片邊界,CodeSignal 隱藏用例最愛卡這種 off-by-one。
五、總結
ByteDance CodeSignal OA 70 分鐘 4 題,題型與 Uber/Roblox/HRT/TikTok 通用庫高度重合:天際線二分、矩陣十字預處理、字串翻轉都不偏,但全 AC 靠的是準確率 + 時間管理,尤其邊界處理。提前在 CodeSignal 上練手感,比臨場硬想划算得多。
FAQ
Q1:ByteDance OA 是什麼平台、幾道題?
CodeSignal 平台,70 分鐘 4 題,題庫與 Uber/Roblox/HRT/TikTok 通用題高度相似。難度中等,核心考準確率和時間管理。
Q2:天際線最大正方形怎麼想?
二分邊長 k,判定「是否存在連續 k 棟樓高度都 ≥ k」,O(n) 判定 + 二分 = O(n log n)。注意邊長上界是 min(樓數, 最高樓)。
Q3:近似規則十字的關鍵是什麼?
對每行 / 每列預處理「去掉至多一個元素後是否同值、公共值是多少」,交點處元素可任意,只要行列的非交點元素都等於同一個公共值即可計數。複雜度 O(R·C)。
Q4:怎麼準備 ByteDance OA?
在 CodeSignal 上按通用題庫刷手感(二分、矩陣預處理、字串模擬),重點練邊界和時間分配。如需四題限時陪練,或 OA代面 / OA輔助 的即時對接,可發崗位 JD 先做題型預測再排練習計劃。
正在準備 ByteDance OA?
ByteDance CodeSignal OA 考通用題庫 + 準確率 + 時間管理。oavoservice 提供 ByteDance 全流程陪練:天際線 / 矩陣 / 字串題限時模擬、邊界陷阱梳理、70 分鐘節奏演練,也支持 OA代面 / OA輔助 的即時對接。教練熟悉 CodeSignal 通用題庫與評分邏輯。
立即添加微信 Coding0201,獲取 ByteDance 真題與陪練。
聯絡方式
- 微信:Coding0201
- Email:[email protected]
- Telegram:@OAVOProxy