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