← 返回博客列表 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 真题与陪练

联系方式