← 返回部落格列表 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])

    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 真題與陪練

聯絡方式