目录
正在加载目录...

Jane Street OA 面经|Mastermind 猜码游戏八个 part 全拆解

Jane Street OA 发得不算多,但陆续也接到过几场。他家的题风很有特点:不是散装的算法题,而是围绕一个游戏场景层层递进的多 part 题——我这场做的是经典的 Mastermind 猜码游戏,从 S1 到 S2 一共八个 part,越往后越考验前面代码的复用性。整体难度比亚麻、Google 的 OA 高一档,但也不是什么问题,把题目和思路完整写下来。

Jane Street OA 面经|Mastermind 猜码游戏八个 part 全拆解

Jane Street OA 形式

在线平台,题目分 S1、S2 两个 section,共八个 part 递进解锁。每个 part 都建立在前面的基础上,题面会明确提示”可以把上一 part 的函数复制过来用”——所以从第一问开始就要把代码写得模块化,后面全是复利。

游戏规则

两个玩家:guesser 和 codemaker。codemaker 先定一个 4 位颜色密码,颜色从 R、O、Y、G、B、P 六种里选,可以重复(比如 RGBY、GGGO、YOYO 都合法)。guesser 每轮猜一个码,得到两个数字的反馈:

Exact matches:颜色和位置都对的个数。

Color matches:颜色对但位置不对的个数。

关键细节:每个字符只能被计入一次匹配——可以想象每发生一次匹配就把那个字符”用掉”,且 exact 永远优先于 color 消耗字符。比如猜 RGBY、密码是 RBYG:首位 R 是 exact match,划掉;剩下 _GBY 和 _BYG,G 在两边都有但位置不同记一个 color match,B 同理,Y 同理——最终 1 exact + 3 color。

Part 1-2:实现匹配计数器

题意:给 guess 和 secret,返回 (exact, color) 两个计数。

Jane Street OA 面经|Mastermind 猜码游戏八个 part 全拆解

思路:两遍扫描。第一遍找精确匹配——逐位比较,相同就计数并把两边的这个位置标记掉。第二遍处理剩余字符:统计 secret 剩余字符的频率表,再遍历 guess 的剩余字符,频率表里有就记一个 color match 并把计数减一。返回两个数。

坑就在用掉这个机制:重复颜色的场景(比如 guess 有两个 G、secret 只有一个 G)必须靠频率减计数来保证不多算,直接用 in 判断必错。

Part 3-4:根据历史筛选可能的密码

题意:给 previous_guesses 和 previous_responses 两个平行列表,输出所有和全部历史一致的”可能密码”,按字母序排列。比如历史是 [“RGBY” → (0,0), “PPPP” → (3,0)],输出 [“GPPP”, “PGPP”, “PPGP”, “PPPG”]。

Jane Street OA 面经|Mastermind 猜码游戏八个 part 全拆解

思路:暴力但正确——生成全部 6⁴ = 1296 个候选码,对每个候选逐条验证:假设它是真密码,用 Part 1 的 num_matches 函数算它对每条历史 guess 的反馈,和记录的 response 全部一致才保留。1296 个候选乘几条历史,量级完全不用优化。

题面还贴心提示了一个边界:历史为空时(Test Case 10),所有 1296 个码都是可能的,直接返回全量有序列表。

这一 part 印证了前面说的复用逻辑:num_matches 写得干净,这里就是一个双重循环的事。

Part 5 起(S2):Cheating Codemaker

题意:换到 codemaker 视角作弊。正常玩法是开局就定死一个密码;作弊玩法是不定密码,对每个 guess 都给一个”让剩余可能密码数量最大化”的反馈——但反馈必须和之前所有历史自洽(比如之前对 RGBY 回了 (0,0),就不能再对 YBGR 回任何匹配,因为那些颜色都不该在密码里)。只有当可能性收敛到唯一时才被迫承认。

要求实现:给当前 guess 和全部历史,输出让剩余候选最多的 response。平局时优先 exact 多的,再 color 多的——比如 (2,2)、(3,0)、(3,1) 三个并列,返回 (3,1)。

Jane Street OA 面经|Mastermind 猜码游戏八个 part 全拆解

思路:站在前面两问的肩膀上。先用 Part 3 的逻辑算出当前和历史一致的候选码集合;然后对集合里每个候选码,模拟”如果它是密码,这次 guess 会得到什么 response”,把候选码按 response 分桶计数;最大的桶对应的 response 就是答案,桶大小并列时按 (exact, color) 的优先规则挑。

本质是一个 minimax 思想的简化版:作弊者每次都躲进人数最多的那个可能性房间。理解了这层,代码就是 num_matches + 分桶统计的组合,二十行内搞定。

整体感受

这套题的设计水平确实配得上 Jane Street 的名声:没有一个 part 单独拿出来是难题,但八个 part 串下来考的是工程演进能力——第一问的函数签名设计得好不好,直接决定第五问写得顺不顺。另外题面的规则细节极多(”用掉”机制、平局优先级、空历史边界),读题的严谨度和写码同等重要。

准备这家 OA 的建议:把 Mastermind 这个游戏的匹配规则提前搞懂(LC 299 Bulls and Cows 是同款计数器);多 part 递进题从 part 1 就按会被复用的标准写代码;每个 part 提交前拿题面例子手推验证。

这套题的原型我在 InterviewShow 的题库里提前碰到过同系列的变种,做的时候规则秒懂、直接进入写码环节,省下的读题时间在这种八 part 长题里就是决定性优势。他家北美 OA 和 VO 的备考覆盖一直在持续更新,有需要的可以去看看。

END