目录
正在加载目录...

Google OA 真题分享|两题轻松 AC,思路对了其实不难

Google OA 的题风一直比较稳,不靠偏门技巧,考的是你能不能快速看穿题目背后的数学关系,然后用最干净的代码把它写出来。

这场两道题都属于”观察到关键点就秒”的类型,但题面偏长,例子没走通就动手的话很容易绕进去。把题目和思路完整拆出来,帮还没做过这类风格的同学建立一个感觉。

Google OA 真题分享|两题轻松 AC,思路对了其实不难

题 1:最多翻转一个数,让数组和的绝对值最小

题意

给一个整型数组 A,最多选一个元素乘以 -1,使数组元素之和尽量接近 0,返回能得到的最小绝对值和。

例子:[1, 3, 2, 5],把 5 取反得到和为 1,是最优的,返回 1;[-4, 0, -3, -3],把 -4 取反后和为 -2,绝对值 2;[4, -3, 5, -7],原和已经是 -1,翻转任何一个都更差,返回 1。

Google OA 真题分享|两题轻松 AC,思路对了其实不难

思路

先算原数组总和 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。

Google OA 真题分享|两题轻松 AC,思路对了其实不难

思路

左右各自排好序之后要整体有序,等价于一个条件:左段最大值 ≤ 右段最小值。

所以不需要真的去排序,只需要预处理两个数组:

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 题型,提前刷过类似题,正式做的时候就是默写加微调。有需要的来聊。

END