← 返回博客列表 JPMorgan Chase HackerRank OA 2026 真题:Distinct Digit Numbers + 队列锦标赛 K 连胜
JPMorgan

JPMorgan Chase HackerRank OA 2026 真题:Distinct Digit Numbers + 队列锦标赛 K 连胜

2026-05-14

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] 表示战斗力,按队列顺序入场。规则:

  1. 队首两人对战,potential 高的胜
  2. 输者去到队尾
  3. 胜者保留在队首,并累加 win_streak
  4. 找到第一个累计 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