目录
正在加载目录...

Visa OA 真题分析|三道题全拆解,十分钟能秒的关键在识别模型

Visa OA 走 HackerRank,三道题,难度递进但都不算刁钻。这套题的特点是:每道都有一个想到就秒、想不到就绕远路的关键观察。三道题的题面和思路完整写下来,投 Visa 的可以直接对着准备。

Visa OA 真题分析|三道题全拆解,十分钟能秒的关键在识别模型

真题一:Subarray Sum

题意

给一个 n 个整数的数组,求所有连续子数组的元素总和之和。

比如 [4, 5, 6]:一元子数组 [4]、[5]、[6],二元 [4,5]、[5,6],三元 [4,5,6],全部加起来 4+5+6+(4+5)+(5+6)+(4+5+6) = 50。再比如 [1,1,1],答案是 10。

约束:n 到 2×10⁵,元素值到 10³。

Visa OA 真题分析|三道题全拆解,十分钟能秒的关键在识别模型

思路

双重循环枚举所有起止位置再求和是 O(n²) 起步,n 到 2×10⁵ 会超时(题面数据友好的批次能混过,但别赌)。

正解是贡献法:不枚举子数组,改问每个元素被算了几次。位置 i 的元素(0-based)会出现在 (i+1) × (n-i) 个子数组里——左端点有 i+1 种选法,右端点有 n-i 种。所以答案就是 Σ arr[i] × (i+1) × (n-i),一遍循环 O(n) 出结果。

注意结果可能超 int,用 long/Python 无所谓。这题是”从枚举视角切到贡献视角”的最经典入门题,值得吃透。

真题二:Planning Production

题意

工厂要生产多个产品,每个产品有两个成本:worstCase 是开工前手里必须有的现金门槛,expected 是实际消耗。产品可以按任意顺序生产,做完一个后剩余现金继续用于下一个。求把所有产品做完所需的最小初始资金。

例子:worstCase = [6,5,7],expected = [4,2,1]。最优顺序是 2→1→0:起始 9 块,做产品 2(门槛 7,花 1)剩 8,做产品 1(门槛 5,花 2)剩 6,做产品 0(门槛 6,花 4)剩 2。最小初始资金 9。

Visa OA 真题分析|三道题全拆解,十分钟能秒的关键在识别模型

思路

贪心排序题。直觉是先做”门槛高但花得少”的——严谨表述是按 worstCase – expected 从大到小排序,依次生产。

为什么对:门槛与消耗之差越大,说明这个产品”占用高但归还多”,趁现金最充裕的开局先过这些高门槛,后面现金池缩水时再做门槛低的,缺口最小。

实现上排序后模拟一遍:维护当前需要的最小初始资金 ans 和当前现金 now,遇到 now < worstCase[i] 就把差额补进 ans 和 now,然后 now 减去 expected[i]。O(n log n)。

这题和 LC 上”最少初始能量做完所有任务”(LC 1665)是同一个模型,做过就是默写。

真题三:Anagram Period

题意

给一个小写字母串 input_str,求最小长度 L,使得原串能切成若干个长度为 L 的块,且所有块两两互为异位词(字符种类和数量完全相同)。

例子一:”abcbcacba”,答案 3——可以看成 “abc”、”bca”、”cba” 三块,互为异位词。例子二:”bbaaabababaabb”,答案 4,比如按 “bbaa”、”abab”、”abaa”……这类切法验证。

约束:串长到 10⁵。

思路

L 必须整除串长,所以只需枚举串长的所有约数,从小到大逐个检验:按 L 切块,把每块的字符统计(排序或 26 位计数向量)算出来,所有块一致则 L 就是答案,直接返回。

复杂度看约数个数乘每次检验的 O(n),10⁵ 的约数撑死一百来个,随便过。实现上用 26 长度的计数元组比对,比每块排序更快也更稳。

第一个能过的 L 就是最小值,别忘了 L = n(整串自己一块)永远合法,所以一定有解。

写在最后

这三道的通关钥匙分别是:贡献法换视角、按差值排序的贪心、枚举约数加频次比对。每道题的代码都不超过十五行,时间全花在认出模型上——认出来十分钟收工,认不出来一小时都在跟暴力解的超时搏斗。

Visa 的题池不深,这三道都是复现率很高的常客。我做的时候三道全是提前在 InterviewShow 题库里见过的类型,上手即默写。这种池子小的公司,考前把高频题过一遍的收益是肉眼可见的,他家北美各厂 OA、VO 的备考覆盖一直在更新,最近亚麻四轮连面的人也多,有需要的可以去看看。

END