刚做完一套 HRT OA ,平台还是 CodeSignal,但题库明显换了一批新题。70 分钟四道,整体难度不算夸张,把题意读清楚按规则模拟就能过。我大概二十来分钟搞定,四道全 AC。HRT 这边还是老规矩:OA 必须全过才有后续 VO,少一题基本就停了。

第一题:字符串两两交换
题意 给一个只包含小写字母的字符串,按每两个字符一组做交换。位置 0 和 1 换、2 和 3 换,以此类推。如果长度是奇数,最后多出来的那个字符保持不动。
例:”abcdef” → “badcfe”,”abcde” → “badce”。

思路 直接按偶数下标遍历,每次把 i 和 i+1 交换即可。如果 i+1 已经越界就跳过。数据范围最大才 100,完全不用考虑优化,写成最直观的模拟就行。注意别手滑把奇数长度的最后一个字符弄丢。
第二题:调试器模拟
题意 给你代码总行数 codeLength、一组已排序的断点 breakpoints,以及一串用户操作 actions。调试器一开始停在第 1 行。
操作只有两种:
- “next”:走到下一行(保证不是最后一行)
- “continue”:一直往前走,直到遇到下一个断点(保证后面一定还有断点)
问所有操作执行完后,调试器停在第几行。

思路 维护一个当前行号,初始为 1。遇到 next 就加一;遇到 continue 就在断点数组里找到第一个大于当前行的断点,直接跳到那个位置。断点数量不多,每次线性扫一遍找下一个断点完全够用。题目已经保证了边界情况不会出问题,所以不用额外判断「找不到断点」或「已经到最后一行」这些情况,专心把跳转逻辑写对就好。
第三题:激光棋盘上的机器人
题意 一个 numRows × numColumns 的棋盘,上面放了若干激光。每束激光会毁掉它所在的整行和整列。机器人在 (curRow, curColumn),只能选一个方向(上、下、左、右)直线移动,问在碰到激光覆盖区域或棋盘边界之前,最多能安全经过多少个格子。
注意:起点本身是被保护的,即使有激光覆盖到起点所在的行或列,起点那一格也先算安全。

思路 机器人只能走直线,所以本质是在算四个方向上「离最近危险点有多远」。遍历所有激光,分别维护上、下、左、右四个方向上最近的被覆盖行号/列号。算完之后,用当前位置减去(或被减)这些最近危险位置,得到四个方向能走的格数,取最大值即可。需要特判的是:如果起点所在行或列本身就被某束激光覆盖,那么在对应方向上能走的距离可能是 0,别漏了这个情况。
第四题:文件分片合并
题意 用户上传大文件时,会陆续发来若干字节区间 chunks,每个区间是 [l, r](闭区间,1-based)。每收到一个分片,都要返回「到目前为止已经收到的所有连续字节范围」。区间可能重叠,甚至完全重复,需要合并成不相交的连续段。
例:依次收到 [1,1]、[2,2]、[3,3],每次返回的结果分别是 [[1,1]]、[[1,2]]、[[1,3]]。、

思路 维护一个有序且互不相交的区间列表。每来一个新区间,就找到所有和它有重叠(或相邻)的旧区间,合并成一段,再插回列表里。可以用一次线性扫描完成合并:把新区间和现有列表里所有相交的段统一成一个大区间,不相交的段原样保留。因为每次都要输出当前完整结果,所以合并后直接把整个列表返回即可。注意题目允许重复发送相同数据,合并逻辑要能正确处理完全被包含的情况。
All pass 经验分享
四道题风格比较统一,都是模拟加细节,没有很难的算法,但题意一定要读细,边界别漏。CodeSignal 现在这批题和以前常见的那套不太一样,遇到新题别慌,按描述一步步实现通常就能过。
HRT OA 过了才有 VO,全 AC 还是比较关键的。最近北美量化、交易公司的 OA 题型变化都挺快,有需要OA辅助的同学可以随时聊。
祝大家顺利进 VO,拿到心仪 offer。