上周收到 Capital One 的 OA 邀请,70 分钟 CodeSignal 4 题。当时正在准备别家的我立刻调整策略:不刷题海,只打高频考点。最后提前将近 40 分钟交卷,4 题全部通过。把题目和思路整理出来,给后面投 Capital One 的朋友参考。
OA 基本信息
平台是 CodeSignal,时间 70 分钟,共 4 道题,难度按顺序递进:Easy → Medium → Medium+ → Hard。题目全英文描述,不需要处理输入输出,直接写函数体。Capital One 的 OA 在 CodeSignal General 题库里出题,考点分布非常稳定,基本是数组/字符串基础、哈希计数、排序/双指针、模拟实现这个顺序。前两题要当送分题,15 分钟内解决,把时间留给后两题。
Q1:餐厅取餐调度(模拟 + 二分)
题意:两个取餐柜台 A 和 B,各自的可取餐时刻存在两个有序数组里,每次取餐固定耗时 30 个时间单位。需要完成 orders 次取餐,每次都选当前最早可用的时刻,求完成全部取餐时的时间点。
解题思路:纯模拟题,逻辑不复杂,关键是"找当前时间之后最早的可用时刻"这个子逻辑。数组已经有序,二分找第一个大于等于当前时间的时刻即可,O(orders × log n) 完全够用。注意处理数组越界,以及当前时间正好等于可取时刻的情况。
Q2:长度为 4 且恰好含 2 种字符的子串(滑动窗口)
题意:给一个小写英文字母字符串,统计长度为 4 的子串中,不同字符数恰好为 2 的子串数量。
解题思路:窗口长度固定,直接滑。维护窗口内的字符频次表,右移一格就加一个字符、减一个字符,频次表大小等于 2 时计数加一。O(n) 解法,三分钟内应该能写完。唯一注意的是长度不足 4 时直接返回 0,加个前置判断就行。
Q3:预算内双任务最大耗时(排序 + 双指针)
题意:给一个任务耗时数组和预算 budget,选出两个不同的任务,使耗时之和不超过 budget,返回最大的合法和;不存在则返回 -1。
解题思路:暴力解 O(n²) 枚举所有数对,题目数据范围允许,可以直接双层循环。如果想更优,排序后双指针从两端往中间收,O(n log n)。OA 里别为了优化浪费时间,先跑通再说。注意结果要初始化为 -1,以及"两个不同任务"意味着下标不能重复取。
Q4:方块下落与消行(模拟 + 图形放置)
题意:给一个 n×m 的全零网格,按顺序下落一系列方块:横条(1×k)、竖条(k×1)、方块(2×2),每个方块用它在 pieces 数组里的 1-based 序号标记。按重力规则从上往下落,贴着底部或已有方块的顶部停住;每当某一行被完全填满就消除,上面的方块整体下移。返回最终的网格状态。
解题思路:这是 OA 里最费时间的一道,逻辑不难但实现量大。核心是把每种方块的形状用相对坐标预定义好,然后模拟下落过程——对每个方块从底部向上扫描,找到第一个不重叠的合法位置,落定后检查消行,消完还要让上面的方块重新做重力下落。写完记得用例子手动验证一遍再提交,坐标偏移和消行后的下移顺序最容易出错。
备战建议
Capital One 的 OA 题型非常稳定,前两题基本送分,第三题在边界条件上容易出错,第四题实现量大但逻辑直白。时间分配建议:Q1+Q2 合计不超过 15 分钟,Q3 给 15 分钟,剩下 40 分钟留给 Q4,写完之后一定要留时间跑测试用例。
最后想分享一下我的备战心得
Capital One OA 的信息差还是挺大的,尤其是 Q4 这种图形放置加状态维护的题,如果没有提前见过类似题型,很容易时间不够。我在准备过程中找 oavoservice 做了 OA 辅助,他们整理的 Capital One 高频题库覆盖率很高,Q3 那道双指针变种题在题库里见过,节省了不少卡壳时间,最后也顺利通过了。