← 返回部落格列表 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