最近剛做完 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& 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 變體
有些方向真的和實際考試挺接近。