JPMorgan Chase 的 HackerRank OA 在金融科技公司中属于"中等偏下"难度,但两道题往往一起出——Distinct Digit Numbers(区间内不同数字计数)+ First K-Winner Queue Tournament(队列锦标赛 K 连胜)。两道题都不算 LeetCode Hard,但 JPMorgan 的隐藏测试集会卡 1e6 量级数据,纯暴力会 TLE。本文给出 2026 春招最新两道原题的 Python 满分解法、复杂度证明与 OA 通过后的 Leadership Principles 行为面试衔接策略。
JPMorgan OA 概览
| 维度 | 详情 |
|---|---|
| 平台 | HackerRank for Work |
| 时长 | 60-75 分钟 |
| 题量 | 2-3 道 |
| 难度 | LeetCode Easy ~ Medium |
| 投递岗位 | NAMR SWE / AWM Tech / CIB Tech / Research Tech |
| 通过率 | 约 35-45% |
题目一:Distinct Digit Numbers
题目描述
给定区间 [n, m],统计区间内所有数字位都不重复的整数个数。
示例:
n = 10, m = 25
区间内 {10, 12, 13, 14, ..., 21, 23, 24, 25} 都满足
{11, 22} 不满足(数字重复)
解题思路
暴力解:O((m-n) × log m)
逐数字检查,转字符串后判断 len(set(s)) == len(s)。
def count_distinct_brute(n: int, m: int) -> int:
count = 0
for num in range(n, m + 1):
s = str(num)
if len(set(s)) == len(s):
count += 1
return count
适用范围:m - n ≤ 1e6 时可过。但 JPMorgan 部分版本会给到 1e9 区间,需要优化。
优化解:数位 DP O(D × 2^D)
数位 DP 枚举 m 以下满足条件的数字数量 f(m),结果 = f(m) - f(n - 1)。
from functools import lru_cache
def count_distinct(n: int, m: int) -> int:
def f(x: int) -> int:
if x < 0:
return 0
digits = [int(c) for c in str(x)]
D = len(digits)
@lru_cache(maxsize=None)
def dp(pos: int, mask: int, tight: bool, started: bool) -> int:
if pos == D:
return 1 if started else 0
limit = digits[pos] if tight else 9
total = 0
for d in range(0, limit + 1):
if started and (mask >> d) & 1:
continue
new_mask = mask | (1 << d) if (started or d > 0) else mask
total += dp(
pos + 1,
new_mask,
tight and (d == limit),
started or (d > 0),
)
return total
return dp(0, 0, True, False)
return f(m) - f(n - 1)
时间复杂度:O(D × 2^D × 10),D 为 m 的位数 ≤ 10
空间复杂度:O(D × 2^D)
实战策略
JPMorgan OA 的隐藏测试一般在 m ≤ 1e6,暴力解直接交即可拿满分。但写代码时建议:
- 数据规模检查(
assert m - n <= 10**6)- 用
len(set(s)) == len(s)而非显式遍历- 注意负数(n < 0 时 JPMorgan 期望返回 0)
题目二:First K-Winner in Queue Tournament
题目描述
n 个玩家用 potentials[i] 表示战斗力,按队列顺序入场。规则:
- 队首两人对战,potential 高的胜
- 输者去到队尾
- 胜者保留在队首,并累加 win_streak
- 找到第一个累计 K 连胜的玩家
示例:
potentials = [3, 1, 4, 2, 5]
k = 3
# Round 1: 3 vs 1 → 3 wins, streak=1, [3,4,2,5,1]
# Round 2: 3 vs 4 → 4 wins, streak=1, [4,2,5,1,3]
# Round 3: 4 vs 2 → 4 wins, streak=2
# Round 4: 4 vs 5 → 5 wins, streak=1
# Round 5: 5 vs 1 → 5 wins, streak=2
# Round 6: 5 vs 3 → 5 wins, streak=3 → return 5
解题思路
朴素 deque 模拟 O(n × k) 最坏
from collections import deque
def first_k_winner_naive(potentials, k):
q = deque(potentials)
current = q.popleft()
streak = 0
while streak < k:
challenger = q.popleft()
if current > challenger:
streak += 1
q.append(challenger)
else:
q.append(current)
current = challenger
streak = 1
return current
最坏情况:k=n × n 时 TLE。
优化解:观察"最大值必胜"O(n)
关键观察:队列中最大值最多在第 n 轮内一定胜出。如果 k ≥ n,答案就是数组最大值;如果 k < n,朴素模拟最多 n + k 轮。
from collections import deque
from typing import List
def first_k_winner(potentials: List[int], k: int) -> int:
if k >= len(potentials):
return max(potentials)
q = deque(potentials)
current = q.popleft()
streak = 0
while streak < k:
challenger = q.popleft()
if current > challenger:
streak += 1
q.append(challenger)
else:
q.append(current)
current = challenger
streak = 1
return current
时间复杂度:O(n + k),k ≤ n
空间复杂度:O(n)
隐藏 case 防御
| 输入 | 期望 |
|---|---|
potentials = [1], k = 1 |
返回 1(单玩家直接胜出) |
potentials = [5, 5, 5], k = 2 |
题意"潜力相同"应明确——JPMorgan 期望按 index 在前的胜出 |
k = 0 |
返回队首玩家 |
k > n^2 |
返回 max(potentials)(必然由最大值产生) |
OA 通过后:行为面试与 Leadership Principles
JPMorgan OA 通过后,HR 通常 1-2 周内联系,进入 HireVue 视频面试或HR Phone Screen。无论哪条路径,都会反复考察 JPMorgan 的 Leadership Principles:
| Principle | 高频问题 |
|---|---|
| Customer Centricity | "Tell me about a time you balanced client request with internal constraints" |
| Drive Innovation | "Describe a project where you challenged the status quo" |
| Set the Standard for Integrity | "Tell me about a time you made an ethical decision" |
| Foster Inclusion | "Describe a cross-cultural collaboration" |
| Embrace Change | "Talk about adapting to ambiguous requirements" |
STAR 模板:Situation 10s → Task 10s → Action 40s → Result 10s。
FAQ
JPMorgan OA 通过率多少?
整体通过率约 35-45%。NAMR SWE 比 AWM Tech 略低(投递量大),CIB Tech 较高(要求金融背景)。两道题都做完且 hidden case 全绿才算通过——只完成一道几乎一定挂。
OA 之后多久收到通知?
平均 7-14 个工作日。AWM 部门较慢,可能拖 3 周。Tech 部门 1 周内基本会有反馈。
Distinct Digit Numbers 必须用数位 DP 吗?
不一定。JPMorgan 隐藏测试 95% 在 1e6 区间内,暴力解能拿满分。但建议代码注释里写一句"if range > 1e7 use digit DP",体现对优化的认知。
Queue Tournament 这道题在 LeetCode 有同类题吗?
最接近的是 LeetCode 1535. Find the Winner of an Array Game。JPMorgan 这道题是它的变体——LeetCode 那道题保证 k ≤ n,而 JPMorgan 会给 k > n 的 case,需要额外判断。
JPMorgan OA 用什么语言通过率最高?
Python > Java > C++。HackerRank 内置 Python timing 比 C++ 慢 5-10 倍,但 JPMorgan 数据量 1e6 完全够用。Python 的可读性在 code review 维度有加分。
正在准备 JPMorgan OA?
oavoservice 提供 JPMorgan / Goldman Sachs / Morgan Stanley / BlackRock 等金融科技岗位 OA 全流程辅助。我们对 NAMR SWE、AWM Tech、CIB Tech 三条产品线的 OA 题型差异有完整复盘,并能根据你的目标 LOB 定制 Leadership Principles 的 STAR 模板。
立即添加微信:Coding0201,获取 JPMorgan OA 一对一辅导。
#JPMorgan #JPMorganOA #HackerRank #金融校招 #SWE #OA真题
联系方式
Email: [email protected]
Telegram: @OAVOProxy