这次 Google 2026 New Grad OA 确实换新题了,感觉题库终于开始动了。整体难度不算特别刁钻,但思考方向如果跑偏,其实挺容易浪费时间。流程还是老样子,拍照验证之后直接开做,前后大概十分钟就把主体写完了。提交后系统又补了两个 test case,算是小小压力测试,好在思路本身比较稳,最后顺利 AC。简单说下两道题的核心解法。
Coding 1
给定一个数组 A,表示学生的身高。所有学生需要排成若干队伍,学生会按照数组中出现的顺序依次到达。对于第 i 个学生,如果存在一支队伍,其中所有学生的身高都高于 A[i],那么该学生可以加入其中任意一支队伍;如果不存在这样的队伍,则该学生需要新建一支队伍。你的任务是计算最终最少会创建多少支队伍。
请编写一个函数:给定一个非空整数数组 A(长度为 N),返回最少创建的队伍数量。
解题思路
这题本质是在维护若干个“队尾严格递减”的队伍。每来一个学生,就去找当前队伍中队尾身高大于他的那一排,并尽量把他放进去,这样可以给后面的学生留下更多空间。如果没有符合条件的队伍,就新开一排。实现时可以用一个数组记录每排的队尾,并保持有序,然后通过二分查找找到第一个大于当前身高的位置进行替换;找不到就追加新队伍。整体是一个典型的贪心 + 二分维护单调结构(LIS 变形),时间复杂度可以做到 O(n log n)。
Coding 2
有若干需要执行的进程。每个进程对运行它的服务器会产生一定的负载,该负载由一个整数表示。服务器的总负载等于其上所有进程负载之和。现在你有两台服务器可供使用,需要将所有进程分配到这两台服务器上,使得它们的总负载差的绝对值最小。
请编写一个函数:给定一个包含 N 个整数的数组 A,其中每个元素表示对应进程的负载,函数应返回两台服务器负载差的最小绝对值。
解题思路
目标是让两台服务器的负载尽可能接近,因此可以把问题转化为:从数组中选出一部分进程,使它们的总和尽量接近所有负载和的一半。设总和为 S,只要找到一个子集和最接近 S/2,最终差值就是 S - 2 * subsetSum。这是非常典型的0/1 背包 / 子集划分问题:用布尔 DP 判断某个和是否可达,从 target = S/2 往下寻找第一个可行值即可。时间复杂度通常为 O(n * S),在数据范围不极端的 OA 场景下完全可行。
Google 26 NG SDE OA 体验分享
顺便说一下这次 OA 的整体体验。我这场是找了 programhelp 做全程 OA辅助 ,帮我省下了不少来回试错的时间。尤其是这种需要迅速识别题型的 OA,有人在关键点提醒一下方向,和自己硬想的效率完全不在一个量级。最后提交后补测的 test case 也都稳住了,没有出现反复修改的情况,整体做下来心态会轻松很多。如果你最近也在准备 Google 或其他大厂 OA,提前把这些不确定因素降下来,其实通过率会高不少。