最近带学员刷了一套 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])
# row_val[r] = (去掉至多一个元素后行内公共值, 是否可行, 不一致元素的列索引或 -1)
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: # 只有一个异类,它必须是交点
common = v1
idx = values.index(v2)
return common, {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