← 返回博客列表 Capital One OA 完整攻略|SWE / TDP 在线测评 4 题真题与 HireVue 行为面拆解
Capital One

Capital One OA 完整攻略|SWE / TDP 在线测评 4 题真题与 HireVue 行为面拆解

2026-05-16

Capital One 是美国 Top-3 信用卡发卡行,技术招聘量在金融行业里仅次于 JPMorgan 和 BlackRock,SWE 与 Technology Development Program (TDP) 每年放出 800+ 个 New Grad / Intern 岗位。它的 OA 流程是业内最规整的——CodeSignal 编程 + HireVue 视频行为,两关都过才算 OA 通过

本文按一亩三分地、Reddit r/CapitalOne 与 Glassdoor 上 2025-2026 的最新反馈,把 Capital One OA 的题型、评分、Recruit Loop 衔接讲清楚(面向 SWE / TDP track;如果你考的是 Data Science,可以参看我们的 DS 版 OA 文章)。

Capital One SWE / TDP OA 概览

维度 详情
平台 CodeSignal General Coding Framework
时长 75 分钟(部分批次为 70 分钟)
题量 4 道(Level 1 → Level 4 递进)
难度 字符串解析 + 模拟 + 集合运算 + DP 复合
通过线 Level 1-3 全 AC + Level 4 ≥ 50% hidden test
后续 HireVue 行为视频(5-7 题,每题 2-3 分钟)
反馈周期 7-21 天

最大特点:Capital One 不出 LC 风格的图论 / DP 难题,而是出银行业务相关的字符串 / 模拟 / 状态题。题面长(每道 1-2 屏文字),读题 + 建模时间 ≥ 一半

真题:Bank Transaction Logs(4 级递进)

这是 2025 秋季到 2026 春季出现频率最高的题面之一。

Level 1:基础日志解析

题面:给定字符串数组 logs,每条形如 "2026-04-15 10:23:01 USR_001 DEPOSIT 250.00"。实现 top_k_balance(logs, k),返回当前余额最高的 k 个用户(同余额按 user_id 字典序)。

操作类型只有 DEPOSITWITHDRAW

from collections import defaultdict
import heapq

def top_k_balance(logs, k):
    bal = defaultdict(float)
    for line in logs:
        parts = line.split()
        # parts: [date, time, user, op, amount]
        user = parts[2]
        op = parts[3]
        amt = float(parts[4])
        if op == "DEPOSIT":
            bal[user] += amt
        elif op == "WITHDRAW":
            bal[user] -= amt
    ranked = sorted(bal.items(), key=lambda x: (-x[1], x[0]))
    return [u for u, _ in ranked[:k]]

:浮点累加有误差,hidden test 会卡 0.01 精度。Level 1 一开始就用 int(amt * 100) 改成"分",后续 Level 全程整数运算,会省事很多。

Level 2:账户冻结状态

新增操作 FREEZEUNFREEZE:被 freeze 的账户任何 WITHDRAW 都失败(仍记录但不扣钱),DEPOSIT 仍正常。

def parse_logs_v2(logs):
    bal = defaultdict(int)   # 单位:分
    frozen = set()
    fail_count = defaultdict(int)
    for line in logs:
        parts = line.split()
        user, op = parts[2], parts[3]
        if op == "FREEZE":
            frozen.add(user)
        elif op == "UNFREEZE":
            frozen.discard(user)
        elif op == "DEPOSIT":
            bal[user] += int(float(parts[4]) * 100)
        elif op == "WITHDRAW":
            amt = int(float(parts[4]) * 100)
            if user in frozen or bal[user] < amt:
                fail_count[user] += 1
            else:
                bal[user] -= amt
    return bal, fail_count

评分点:用 int(float(x) * 100) 一行避免后续浮点累计错。Level 2 还要返回 fail_count——hidden test 通常包含 "用户 X 应有 5 次失败 WITHDRAW" 的断言。

Level 3:滑动窗口统计

新增需求:实现 transactions_in_last_k_minutes(logs, query_user, k)——给定查询用户与 k 分钟窗口,返回该用户最后一次操作前 k 分钟内的成功 transaction 总数。

思路:先线性扫一遍构建每个 user 的 (timestamp, op, success?) 列表,然后对查询用户做双指针 / 二分

from datetime import datetime
from bisect import bisect_left

def build_index(logs):
    index = defaultdict(list)  # user -> list of (epoch_seconds, success_bool)
    bal = defaultdict(int)
    frozen = set()
    for line in logs:
        parts = line.split()
        ts = datetime.strptime(parts[0] + " " + parts[1], "%Y-%m-%d %H:%M:%S").timestamp()
        user, op = parts[2], parts[3]
        if op == "FREEZE":
            frozen.add(user)
            continue
        if op == "UNFREEZE":
            frozen.discard(user)
            continue
        amt = int(float(parts[4]) * 100)
        success = True
        if op == "WITHDRAW":
            if user in frozen or bal[user] < amt:
                success = False
            else:
                bal[user] -= amt
        else:  # DEPOSIT
            bal[user] += amt
        index[user].append((ts, success))
    return index

def transactions_in_last_k_minutes(index, user, k):
    if user not in index or not index[user]:
        return 0
    last_ts = index[user][-1][0]
    threshold = last_ts - k * 60
    times = [t for t, _ in index[user]]
    pos = bisect_left(times, threshold)
    return sum(1 for t, s in index[user][pos:] if s)

:题目用 datetime 字符串,直接字符串比较就够(YYYY-MM-DD HH:MM:SS 字典序 = 时间序)。但滑窗 k 分钟最好转成 epoch,否则跨小时 / 跨日要小心。

Level 4:用户分群与最优归并

最终 Level 题面:把所有用户按"行为相似度"分群(操作时间窗 + 金额水平接近),返回 k 个最大的用户群。需要 K-Means / hash bucketing 或简单聚类

70 分钟内拿满分非常困难。典型应对:用简化分桶——按 (avg amount bucket, total transactions bucket) 二维 hash 分桶,然后输出 size 最大的 k 个桶。能拿 50-70% hidden test,足够过线。

def cluster_users(index, k):
    profile = {}
    for user, ops in index.items():
        succ = [op for op in ops if op[1]]
        if not succ:
            profile[user] = (0, 0)
            continue
        n = len(succ)
        # 粗略分桶:操作数桶 0/1/2/3+, 时间跨度桶
        if n <= 1:
            n_bucket = 0
        elif n <= 5:
            n_bucket = 1
        elif n <= 20:
            n_bucket = 2
        else:
            n_bucket = 3
        span = succ[-1][0] - succ[0][0]
        s_bucket = 0 if span < 3600 else 1 if span < 86400 else 2
        profile[user] = (n_bucket, s_bucket)
    buckets = defaultdict(list)
    for u, p in profile.items():
        buckets[p].append(u)
    top = sorted(buckets.values(), key=lambda x: -len(x))[:k]
    return [sorted(g) for g in top]

评分点:Capital One 的 Level 4 不要求最优解——能产出"非空的、deterministic 的、解释得清"的分桶就有 50%+ 分。不要花 20 分钟跑 KMeans 然后 timeout

时间分配建议

Level 推荐用时 关键策略
Level 1 8 min 干净的字符串解析 + 整数化金额
Level 2 12 min 在 Level 1 基础上加 frozen 集合
Level 3 18 min 复用 index,二分定位窗口
Level 4 25 min 哈希分桶 > KMeans,求过线不求满分
Buffer 12 min debug + 检查浮点

HireVue 视频行为面(OA 通过后必经)

OA 编程过了不代表 OA 整体通过——还要做 HireVue 视频行为面。一般在 OA 通过后 3-7 天内邮件邀请,5-7 题,每题 2-3 分钟回答时间

高频问题

问题类型 示例 STAR 准备点
学习经历 "Tell me about a time you learned something new under pressure." 强调 timeline + 学到的具体技能
团队冲突 "Describe a situation when your team disagreed." 你的 mediation 角色,不要责备
客户视角 "How do you balance speed vs. quality?" Capital One 的 "deliver excellence" value
失败反思 "Tell me about a project that didn't go as planned." 学到的教训具体化
为什么 Capital One "Why Capital One specifically?" 提到具体产品 / tech blog

录制要点

备考策略

优先级 重点 推荐题号 / 资源
⭐⭐⭐ 字符串解析 / split / parse LC 65、LC 224、LC 736
⭐⭐⭐ 模拟 + 状态机 LC 348、LC 1396、LC 1352
⭐⭐ 滑动窗口 + 二分 LC 209、LC 1838、LC 1146
⭐⭐ OOP 设计 LC 146、LC 460、LC 355
HireVue 行为题 Capital One 官方 careers FAQ + Glassdoor BQ 题库

FAQ

Q1:Capital One OA 难度比 FAANG 高还是低?

算法难度低——Level 1-3 大约是 LC Easy 至 Medium 偏 Easy。但整体不容易过,因为:(1) Level 4 直接 hard;(2) 题面长,读题 + 建模成本高;(3) 后续 HireVue 视频面也算 OA 通过条件,很多 candidate 编程过了倒在 HireVue

Q2:Capital One TDP 和 SWE 是同一个 OA 吗?

编程 OA 完全一样,但 HireVue 题库略有不同:

录用率:TDP 录用面更广(也接受非 CS 专业),SWE 偏向 CS / 软工硬专业,bar 略高。

Q3:Capital One OA 通过后多久 onsite?

OA + HireVue 全过后,通常 2-4 周进入 Power Day(Capital One 的 onsite 名):1 个 Behavioral + 2 个 Coding + 1 个 Case(业务情境分析)。整个 OA → Offer 流程平均 6-10 周

Q4:HireVue 可以提前看题吗?

不可以。每题点开后有 30 秒思考时间,然后强制开始录制。建议:把上面 6 个高频题的 STAR 故事提前写好背熟,HireVue 时候你能在 30 秒内决定用哪个。

Q5:Capital One 看 GPA 吗?

TDP 卡 GPA 3.0+(有时 3.2+),SWE 不硬卡但简历里 GPA < 3.0 默认进 review queue。如果 GPA 低,强烈建议用 Recruiter Connect / 校招活动认识 recruiter,绕过 ATS 自动过滤。

Q6:Capital One Power Day 通过率多少?

约 30-40%——比 FAANG onsite(25-30%)略高,因为 Capital One 重视 culture fit 多于"能否秒杀难题"。建议:在 Onsite Coding 阶段,讲清思路 + 写出 working solution > 一行流写最优解


联系方式

正在准备 Capital One TDP / SWE / DS 或类似金融科技岗(JPMorgan, BlackRock, Discover)的 candidate,OA 编程关只是第一道筛子——后面的 HireVue + Power Day 行为面才是真正淘汰主力。我们整理了 Capital One Top 30 HireVue 题 + STAR 模板 + Power Day 真题集,欢迎联系交流。

立即添加微信 Coding0201获取 Capital One OA 与 HireVue 真题