光是 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 真题与陪练。
联系方式
- 微信:Coding0201
- Email:[email protected]
- Telegram:@OAVOProxy