Google OA 的题风一直比较稳,不靠偏门技巧,考的是你能不能快速看穿题目背后的数学关系,然后用最干净的代码把它写出来。
这场两道题都属于”观察到关键点就秒”的类型,但题面偏长,例子没走通就动手的话很容易绕进去。把题目和思路完整拆出来,帮还没做过这类风格的同学建立一个感觉。

题 1:最多翻转一个数,让数组和的绝对值最小
题意
给一个整型数组 A,最多选一个元素乘以 -1,使数组元素之和尽量接近 0,返回能得到的最小绝对值和。
例子:[1, 3, 2, 5],把 5 取反得到和为 1,是最优的,返回 1;[-4, 0, -3, -3],把 -4 取反后和为 -2,绝对值 2;[4, -3, 5, -7],原和已经是 -1,翻转任何一个都更差,返回 1。

思路
先算原数组总和 S。如果翻转某个元素 x,新和变成 S – 2x。
所以只要遍历每个位置,算 |S – 2 * A[i]|,取所有结果和原始 |S| 的最小值就行。
有一个容易漏的点:题目是”最多一个”,不翻转也是合法操作,所以 |S| 要和所有翻转情况一起比较,别只看翻转的结果。
时间 O(n),空间 O(1)。
题 2:分割成两段分别排序再拼接,有多少种分法结果有序
题意
把数组切成左右两个非空段,各自排序后再拼回去,问有多少种切法能让最终数组非降序。
例子:[1, 3, 2, 4],切在位置 0(左 [1],右 [3,2,4])拼完是 [1,2,3,4],有序;切在位置 1(左 [1,3],右 [2,4])拼完是 [1,3,2,4],无序;切在位置 2(左 [1,3,2],右 [4])拼完是 [1,2,3,4],有序。答案 2。

思路
左右各自排好序之后要整体有序,等价于一个条件:左段最大值 ≤ 右段最小值。
所以不需要真的去排序,只需要预处理两个数组:
leftMax[i] 存前缀 A[0..i] 的最大值,从左往右扫一遍;rightMin[i] 存后缀 A[i..n-1] 的最小值,从右往左扫一遍。
然后枚举每个切分点 i(0 到 n-2),如果 leftMax[i] <= rightMin[i+1] 就计数加一。
每次排序再比较是 O(n² log n),预处理之后枚举是 O(n),这就是观察的价值所在。
Google OA FAQ
Google OA 有几道题、多长时间?
通常是 2 道题,60 到 90 分钟,个别岗位会有 3 道。
题目难度大概是什么水平?
LC Medium 为主,偶尔有偏 Hard 的观察题,但不考奇偏算法,更多是看你能不能发现关键性质。
题面很长看不下去怎么办?
先把例子手推一遍,搞清楚输入输出关系,比直接读题目描述效率高很多。Google 的题面偏啰嗦,例子才是最直接的信息。
可以用什么语言?
Python、Java、C++ 都可以,选你最熟的就行。
最后说一句
这两道题的共同特点是:暴力解很直观,但发现关键变换(S – 2x、左 max ≤ 右 min)之后就能从 O(n²) 或更差降到 O(n)。Google OA 经常就是考这个——不是让你背模板,是看你能不能快速找到简化问题的切入点。
北美各厂 OA 题型轮换很快,做过的和没做过的差别很大。InterviewShow 整理了 Google 和其他大厂的高频 OA 题型,提前刷过类似题,正式做的时候就是默写加微调。有需要的来聊。