最近刚做完 Google 26NG OA ,整体感受是:题目本身不算特别偏,但非常吃 coding 基础、边界处理能力和时间管理。
Google 的 OA 和很多公司不一样,它不会故意搞特别怪的冷门题,但会在实现细节和代码稳定性上疯狂卡人。很多人以为自己写出来了,结果 hidden cases 一跑直接炸。这次我遇到的题整体偏 LeetCode Medium,数据量不小,暴力基本过不了。

第一题:棋盘硬币收集
题目核心
字符串 board 里有 ‘T’(棋子)、’C’(硬币)、’.’(空)。每次可把任意一个 ‘T’ 向右精确跳 3 格,目标位置必须是空的(不能落另一个 ‘T’ 上)。落在 ‘C’ 上就收集它(每枚只收一次)。问最多能收集多少枚硬币。
解题思路
每个棋子只能走 +3 的步长,所以一个棋子能收集的硬币必须满足 (硬币位置 – 棋子位置) % 3 == 0 且在右边。
由于棋子间不能重叠,移动顺序很重要,但 N 通常很小(示例只有 10 左右),可以采用以下简单有效的方法:
- 提取所有 T 和 C 的位置。
- 用 DP 或 BFS 搜索:状态记录当前所有棋子的位置集合 + 已收集硬币集合(用位掩码或集合)。
- 因为棋子数一般很少,状态数可控,搜索所有合法移动即可得到最大收集数。
推荐实现方向(Python): 用递归 + memo,参数为当前各棋子位置(排序 tuple)和已收集硬币的位掩码,尝试每个棋子向右跳 3 步,如果目标合法就更新状态继续搜索,记录最大收集数。
第二题:数字选组
题目核心
给 N 个两位数,想选尽量多的数,使得选出的所有数至少共享一个相同数字(0-9 任意一个)。返回最大个数。
解题思路
任何合法的组一定都包含同一个数字 d(0~9 之一)。所以直接:
int solution(vector<int>& numbers) {
int ans = 0;
for (int d = 0; d <= 9; d++) {
int cnt = 0;
for (int x : numbers) {
if (x / 10 == d || x % 10 == d) {
cnt++;
}
}
ans = max(ans, cnt);
}
return ans;
}
这就是最优答案,时间 O(10*N),N≤100 完全足够。
示例验证:
- [52,25,11,52,34,55] → 含 5 的有 4 个 → 4
- [11,33,55] → 每个 d 最多覆盖 1 个 → 1
我准备的时候踩过的坑
我之前一开始准备 Google,就是无脑刷 LeetCode。后来发现效率其实一般。因为 Google 很多题不是“原题”。而是那种:你见过类似思想,但实现更恶心的变体。后面我开始专门看真实 OA 面经和高频分类,效率明显高很多。
我当时是在Programhelp 上看了不少 Google 26NG 的 OA 整理,里面有很多:
- 高频 graph 题型
- Google 风格 string 题
- hidden test 容易卡的点
- 常见 BFS 变体
有些方向真的和实际考试挺接近。