8 月这轮 Google SDE NG OA 做完之后有个挺明显的感受:两道题放一起看,压根没考什么复杂算法,反倒像是在测你读题细不细心。刷完不少大厂 OA 之后会发现一个规律——越是号称”简单”的题,往往越容易在某个小细节上栽跟头,这场就是典型例子。

题 1:Token 向右跳 3 步捡 Coin

题意
字符串由 ‘T’(token)、’C’(coin)和空格组成。Token 只能每次向右跳 恰好 3 步(不能 1 或 2 步)。规则:
- 落点不能是 ‘T’,否则这次跳跃非法,无法继续
- 落点是 ‘C’ 可以捡起,捡后该位置变为空,避免重复捡
- 落点是空格或其它非 ‘T’ 字符,正常落地
Token 从下标 0 出发,求最多能捡多少个 Coin。
思路
因为字符串本身不好直接改,先转成 list 存着方便修改。
维护两个变量,current 记当前位置(从 0 开始),coin_count 记捡到的数量。
每一轮算出下一个落点 next_pos = current + 3,先看越不越界,越界就直接结束。没越界的话看落点是什么:如果是 ‘T’,跳跃非法,流程终止;如果是 ‘C’,coin_count 加一,同时把这个位置改回空格,避免下次经过再算一次;如果是空格或者别的字符,正常往前走。然后把 current 更新成 next_pos,继续下一轮。
这题的路径其实是唯一的——因为每次只能加 3,走的路线是固定的,所以老老实实模拟一遍就行,不需要考虑分支或者搜索。唯一要留神的就是捡完 coin 记得把那个位置置空,这个细节漏了就会导致同一个 coin 被算两次(虽然按题目逻辑一条路径本来不会走回头,但写代码时习惯性把这步补上更保险)。
题 2:两位数数组的最大 Group
题意

给定 N 个两位数(10–99)。定义 Group:所有「包含某一相同数字 0–9」的数组成的集合。例如 52 和 28 都含 2,同属数字 2 的 Group;22 只算含 2 一次,不重复计。求最大 Group 里有多少个数。
思路
本质上是在统计:数字 0 到 9 里,每一个数字分别被多少个”不同的两位数”包含过,然后取这十个统计值里最大的那个。
开一个长度 10 的数组或者字典当计数器 cnt。
遍历每个两位数,把它的十位和个位拆出来,放进一个 set 里去重——这一步是关键,就是为了防止像 22 这种两位相同的数把自己重复算进同一个数字的计数里。拆完去重之后,对 set 里剩下的每个数字,各自的 cnt 加一。
遍历完所有数之后,cnt 数组里的最大值就是答案。整体是 O(N) 的复杂度,实现的时候千万别漏了去重这一步,不然像 22、55、88 这类数会把结果算多。
两题放一起看
| 题目类型 | 最容易出错的地方 |
|---|---|
| Token 跳格子模拟 | 落点是 ‘T’ 必须立刻停止;捡到 ‘C’ 之后一定要把那格置空 |
| 最大 Group 计数 | 同一个数里出现两次相同数字,只能算一次贡献 |
Google NG 的 OA 没必要死磕 Hard 难度,Easy 到 Medium 这个区间的速度和正确率反而更重要。这两道题都没用到什么花哨的数据结构,核心就是把题目文字规则老老实实翻译成代码,边界情况写全,基本就能稳过。
几个可能会问到的点
Q:Token 跳格子这题需要考虑回头路或者多种走法吗?
不需要。因为每次只能固定跳 3 步,从起点出发路径是唯一确定的,一次模拟走到底就够了。
Q:第二题为什么一定要用 set 去重?
因为题目明确说了同一个数内重复出现的数字只算一次贡献,如果不去重直接对十位个位分别累加,像 22 这种数会让”数字 2″的计数多算一次,结果就偏高了。
Q:这两题算法难度大概什么水平?
都在基础模拟和计数的层级,没有涉及图论、DP 这类进阶结构,主要考验的是能不能把文字规则完整转换成代码逻辑。
准备 Google 或者其他公司 NG 笔试的时候,建议养成”先读题、拿样例在纸上推一遍、再动手写代码”的习惯,能省掉不少因为细节理解偏差导致的返工。想对照近期出现过的题型练手感的话,可以看看 InterviewShow 整理的 OA 笔记,按自己的复习进度取用就行。
祝大家都顺利过线。