光是 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