← 返回部落格列表 Google OA 備考指南:幻方填充 + 最大子陣列 + 切蛋糕 + 比較字串
Google

Google OA 備考指南:幻方填充 + 最大子陣列 + 切蛋糕 + 比較字串

2026-06-10

光是 OA 這一關就勸退了一波人。但其實只要掌握題集、把握時間分配,OA 就是逆襲的第一步。這篇帶你過一遍 Google OA 的完整流程 + 四道高頻真題解析,提前踩點、少走彎路。

一、Google OA 基礎資訊

Google OA 是少有的「能考原題 LeetCode、又能讓你動腦」的考試,方向相對穩定,但常帶變體和反轉,臨場反應很重要。

內容 說明
平台 CodeSignal(多為校招/實習)或 Karat(偏在職/資深)
總時長 通常 70 ~ 90 分鐘
題目結構 Coding 2–3 道,偶爾加少量簡答/邏輯題
語言支援 Python / Java / C++ 等(選最熟的)
難度分布 常見 1 Medium + 1 Hard,也有 2 Hard,運氣成分不小
是否監控 CodeSignal 版本通常全程錄製 + 拍照認證

二、真題 1:Fill 2D Array(幻方填充)

題目:給定 N×N 矩陣,把 1 到 n×n 填進去,使每行、每列、兩條對角線的和都相等。不行則返回 null。

這是幻方(Magic Square)構造:n=2 無解返回 null;n 為奇數用 Siamese 方法(從首行中間起,每次向右上移,越界回繞,遇佔用則下移一格)。

def fill_matrix(n):
    if n == 2:
        return None
    if n % 2 == 1:                       # 奇數階:Siamese 法
        M = [[0] * n for _ in range(n)]
        i, j = 0, n // 2
        for num in range(1, n * n + 1):
            M[i][j] = num
            ni, nj = (i - 1) % n, (j + 1) % n
            if M[ni][nj]:                # 目標格已佔用 -> 下移一格
                ni, nj = (i + 1) % n, j
            i, j = ni, nj
        return M
    # 雙偶/單偶階有專門構造法(LUX / 交換四宮格),按 n%4 分支處理
    return build_even_magic(n)

面試裡 n 多為奇數,先把 Siamese 法寫穩,再視情況補偶數階。

三、真題 2:Largest Subarray(最大子陣列和)

題目:給定整數陣列,找出和最大的連續子陣列(至少含一個數),返回其和。

經典 Kadane:維護「以當前元素結尾的最大和」,要麼接上前面、要麼從自己重開。

def max_subarray(nums):
    cur = best = nums[0]
    for x in nums[1:]:
        cur = max(x, cur + x)     # 接上前面 or 重開
        best = max(best, cur)
    return best

時間 O(n)、空間 O(1)。注意全負陣列要返回最大的那個負數,所以初值用 nums[0] 而非 0。

四、真題 3:Maximum Area Serving Cake(二分答案)

題目:給定一組圓形蛋糕的半徑和客人數,求能切出的最大「每人等面積」的單塊面積。每塊只能來自一個蛋糕,每人一塊。

面積隨「單塊大小」單調——塊越小能切的份數越多。對面積二分答案,判定每個面積下總份數是否 ≥ 客人數:

import math

def max_area_per_guest(radii, guests):
    areas = [math.pi * r * r for r in radii]
    lo, hi = 0.0, max(areas)
    for _ in range(100):                 # 浮點二分,固定迭代次數控精度
        mid = (lo + hi) / 2
        pieces = sum(int(a // mid) for a in areas) if mid > 0 else guests
        if pieces >= guests:
            lo = mid                     # 還能更大
        else:
            hi = mid
    return lo

關鍵:浮點二分用固定迭代次數(約 100 次)控精度,份數用整除 a // mid 累加。

五、真題 4:Compare Strings(最小字元頻次比較)

題目:定義「字串 A 嚴格小於 B」當且僅當 A 中字典序最小字元的出現頻次 < B 中字典序最小字元的頻次。例如 "abcd"(最小字元 'a' 頻次 1)< "aaa"('a' 頻次 3)。給若干查詢串與若干詞串,對每個查詢統計有多少詞串嚴格大於它。

先把每個字串壓成一個數字 = 其最小字元的頻次,再用排序 + 二分回答查詢:

import bisect

def f(s):                                # 最小字元的出現頻次
    m = min(s)
    return s.count(m)

def compare_strings(queries, words):
    w = sorted(f(x) for x in words)
    res = []
    for q in queries:
        fq = f(q)
        # 嚴格大於 fq 的詞串數量 = 總數 - 第一個 > fq 的右側
        res.append(len(w) - bisect.bisect_right(w, fq))
    return res

把 O(Q×W) 暴力優化到 O((Q+W) log W),是這題的核心。

六、時間分配與臨場策略

階段 動作
開局 2 分鐘 通讀題目,判斷哪道是 Hard,先做有把握的
編碼 先寫樸素解通過範例,再優化複雜度
卡殼時 寫出暴力解拿部分分,別在一道題死磕
收尾 留 5 分鐘跑邊界(空陣列、全負、單元素、浮點精度)

七、總結

Google OA 方向穩定但帶變體:幻方靠構造法、最大子陣列靠 Kadane、切蛋糕靠浮點二分答案、比較字串靠「壓成頻次 + 排序二分」。把這四類模型練熟,再管好時間分配與邊界,OA 就能穩穩過線。


FAQ

Q1:Google OA 用什麼平台、多長時間?

多為 CodeSignal(校招/實習)或 Karat(在職/資深),通常 70–90 分鐘,2–3 道 coding,常 1 Medium + 1 Hard。

Q2:切蛋糕這類浮點題怎麼二分?

對答案(單塊面積)二分,用固定迭代次數(約 100 次)控制精度,判定函數累加每個蛋糕的整除份數是否 ≥ 客人數。

Q3:比較字串怎麼優化?

把每個串壓成「最小字元的頻次」一個數,詞串排序後對每個查詢用 bisect 二分,O((Q+W) log W) 取代 O(Q×W)。

Q4:卡在 Hard 題怎麼辦?

先寫暴力解拿隱藏用例的部分分(CodeSignal 給部分分),再回頭優化,別在一道題上耗光時間。如需 Google OA 限時陪練與題型預測,可聯絡獲取對應崗位的高頻題與複盤資料。


正在準備 Google 面試?

oavoservice 提供 Google OA 全流程陪練:CodeSignal 限時模擬、幻方/Kadane/二分答案/計數高頻題演練、時間分配與邊界自查訓練。教練含前大廠資深工程師,熟悉 Google「穩定題型 + 變體反轉」的考核風格,幫你把部分分拿滿、難題拿穩。

立即新增微信 Coding0201獲取 Google 真題與陪練

聯絡方式