← 返回博客列表 ByteDance OA CodeSignal 四题复盘:最大正方形 + 近似规则十字 + 字符串翻转
ByteDance

ByteDance OA CodeSignal 四题复盘:最大正方形 + 近似规则十字 + 字符串翻转

2026-06-09

最近带学员刷了一套 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 真题与陪练

联系方式