目录
正在加载目录...

Snowflake OA 独家分享|HackerRank 两题十分钟秒

这场 Snowflake OA 两道 HackerRank 题,说实话一眼就有思路,时间基本都花在敲代码上了。他家 OA 全 AC 才有 VO 机会,所以别看题不难,稳稳拿满分才是关键。两道题的题面和思路完整写下来。

Snowflake OA 独家分享|HackerRank 两题十分钟秒

OA 基本信息

平台 HackerRank,两道题,难度中等,S1、S2 各一道。数据规模不算大但也有讲究,两道题各自有一个关键观察,想通了代码都很短。

真题一:Generating Login Codes(双指针分段)

题意

每个员工的登录过程有两个数组:initialLogin(长 n)和 standardLogin(长 m)。安全软件可以反复操作:选任一数组的一个连续子段,把它替换成该段元素之和。比如 [1,5,6,8,2] 可以把 [1,5,6] 替换成 [12],变成 [12,8,2]。

目标是通过操作让两个数组变得相等,且相等后长度尽量长。这个最大可能长度就是 login code。如果两数组无论如何都无法变相等,initialLogin 视为无效,返回 -1。

例子:initialLogin = [2,4,3,7,10],standardLogin = [6,5,5,10],答案 3。

Snowflake OA 独家分享|HackerRank 两题十分钟秒

思路

先看无解条件:合并子段只改变分段方式、不改变总和,所以两数组总和不相等就直接返回 -1。

总和相等时用双指针分段:两个指针分别在两数组上走,各自累加当前段的和。哪边的段和小就把哪边的指针往前推、继续累加,直到两边段和相等——此时凑成一个”对齐段”,段数加一,两指针同时进入下一段。走到底统计出的对齐段数就是答案。

本质是把两个数组切成尽可能多的、和相等的对应段,段数越多长度越长。每个元素最多被访问一次,O(n+m)。

真题二:String Formation(DP 计数)

题意

给一个字符串数组(每个串等长)和一个目标串 target,要求从这些串里挑字符拼出 target,且挑选的字符下标构成严格递增序列(下标是字符在串内的位置,同一个串可以用多个字符)。求拼出 target 的方案数,对 10⁹+7 取模。

两个方案不同的判定:下标序列不同,或者下标序列相同但某个位置的字符取自不同的串。

例子:words = [“adc”,”aec”,”efg”],target = “ac”,有 4 种方案(”a” 从下标 0、”c” 从下标 2,两个位置各自可选来源串的组合)。

Snowflake OA 独家分享|HackerRank 两题十分钟秒

思路

DP 计数。定义 dp[j] 表示匹配到 target 前 j 个字符的方案数,dp[0] = 1(空串一种方案)。

关键预处理:因为下标要严格递增,且同一个下标位置可以由多个不同的串提供同一字符,所以先统计”在下标 i 处,字符 c 一共在多少个串里出现”——记为 cnt[i][c]。

然后按下标 i 从小到大遍历(保证递增),对每个下标 i 和它能匹配的 target 字符,从后往前更新 dp(j 从大到小,避免同一下标被重复使用导致非严格递增):dp[j] += dp[j-1] × cnt[i][target[j-1]]。所有下标处理完,dp[m] 就是答案,全程取模。

从后往前更新是这题的题眼,写成从前往后会把同一个下标算多次。复杂度 O(串长 × m)。

关于我的AC经验

Snowflake 的一个特点是 OA 必须全 AC 才有 VO,所以这种一眼有思路的题反而不能大意,边界(总和不等返回 -1、DP 的取模、下标严格递增)要一次写对,没有丢分的余地。

Snowflake 的题池复现率高,这类双指针分段和 DP 计数的题型是常客。备考时我参考了 InterviewShow 的题库,Snowflake 这类高频题都有收录和思路解析,全 AC 门槛高的 OA 提前刷过原型就是稳。他家北美 OA、VO 的备考覆盖一直在更新,有需要的可以去看看。

END