前几天带一个同学做 Visa OA ,三道题全过了。趁着记忆还新,把题目和思路完整复盘一下,准备 Visa 或者类似 HackerRank 风格 OA 的同学可以直接抄作业。
先说整体感受:Visa 这套题和 Amazon、Walmart 的风格很像,一道贪心/排序,一道前缀和贡献,一道数据结构维护。难度不算顶,但有两个隐藏扣分点。

第一题:任务分配最大化总处理时间
题目大意:有 numTasks 个任务和 numServer 台服务器。任务必须按连续块分配给服务器,每台服务器至少分到 m 个任务,每个任务只属于一台服务器。每台服务器的处理时间定义为它负责的任务中耗时最大的 m 个任务之和,要求最大化所有服务器处理时间的总和。

思路:核心观察是——最终真正参与计算的任务数量固定为 numServer × m,因为每台服务器只取自己块里最大的 m 个求和。所以为了让总和尽量大,我们希望尽可能把全局最大的那些任务都纳入计算。
一个在多数数据下有效的贪心近似是:把所有任务处理时间降序排序,直接取前 numServer × m 个相加。以官方样例验证,processTime = [1,3,5,2,7,1,5,9],前 6 大是 9、7、5、5、3、2,相加正好 31,与官方答案一致。
这里需要给同学提醒一个坑:本题有「连续块」约束,严格来说降序取前 numServer × m 个并不总是可行——如果全局最大的几个值恰好挤在数组同一端,连续分块可能无法把它们分给不同服务器各自的「前 m 大」。官方样例数据较弱,这个贪心能过,但严格证明需要论证「总能构造出让前 numServer × m 大值各自入选的分块」,而这个命题在连续约束下并非显然。实战中如果判题数据强,建议改用「按连续块划分 + 每块取前 m 大」的 DP 兜底思路,避免踩强数据 WA。
第二题:所有 i < j 的 (a[j] − a[i]) 之和
题目大意:给定长度为 n 的数组,求所有满足 i < j 的 a[j] − a[i] 的总和,最后对 10⁹ + 7 取模。

思路:暴力枚举肯定超时(n 到 2×10⁵)。固定右端点 j 来看贡献:对于固定的 j,它前面有 j 个元素(下标从 0 开始),所以 a[j] 会被加 j 次,前面所有 a[i] 各出现一次并被减去。因此:
sum = Σ (j * a[j] − prefixSum[j])遍历过程中一边维护前缀和,一边累加答案,最后取模,时间复杂度 O(n)。
两个实现细节是本题真正的考点:一是 j * a[j] 会溢出,务必用 long long;二是中间结果会出现负数(样例 2 就是负和),取模时必须写成 (x % MOD + MOD) % MOD,否则会得到负数。样例 2 输出 1000000003 正是 −4 取模后的结果,这个点如果没处理会直接 WA。
第三题:每次 ping 后冒泡排序所需的 sweep 次数
题目大意:初始数组全是 0,每次把某个位置变成 1(每个位置只 ping 一次),然后询问当前数组用冒泡排序(只交换相邻的「1 后跟 0」)变成升序所需的 sweep 次数。

思路:观察发现,冒泡过程中每个 0 需要向右「跨过」它前面的所有 1 才能到达最终位置。因此全局所需的最大 sweep 次数,就等于「所有 0 的位置上,其前面 1 的个数」的最大值。
每次把某个位置 p 变成 1,相当于给它后面所有位置的「前面 1 的个数」都加 1,也就是对后缀 [p+1, n] 做一次区间 +1。我们用线段树(或树状数组)维护后缀加操作和全局最大值,每次更新后直接查询最大值即可动态回答每次询问。
小结
三道题里第一题和第二题的坑都在细节:第一题别忽略连续块约束,第二题别忽略负数取模。第三题思路不难,但没想到”区间更新 + 维护最大值”这个模板的话,现场硬推会比较难受,提前把这类模板过一遍很值。
这个同学之前 mock 过类似题型,正式考基本没卡点。Visa 的 OA 说到底还是看思路清不清楚、代码稳不稳。准备类似岗位的同学,这三个题型建议都吃透。
如果你也在准备 Visa、Amazon 或其他大厂的 OA / VO,Interview Show 专注北美技术岗位的面试辅助,团队来自一线大厂,提供一对一 mock、题型梳理和实时辅助。很多同学反馈,针对性准备后通过率明显提升。
有需要的同学可以直接联系我们做免费评估,根据你的背景和时间给出最合适的方案。