DRW 是全球最顶尖的自营交易公司之一,其招聘以数学密度高、淘汰率高著称。不同于一般投行的行为题筛选,DRW 的 OA 直接把概率论、Markov Chain、期权定价和图论算法砸到你面前,限时作答,没有退路。本文整合 Programhelp 平台上多位真实候选人的一手反馈,深度拆解 DRW Online Assessment 的考察逻辑与完整面试流程,帮你在这条竞争最激烈的量化赛道上,提前建立压倒性的优势。

DRW 招募時間線
Step 01 網申
在 DRW 官網提交申請,約 1 周內收到 OA 邀請。部分崗位支援內推(Employee Referral),可加快流程。建議簡歷突出數學競賽、程式設計專案或量化研究經歷。
Step 02 OA
- Quant 方向:6 道數學/統計題,約 45 分鐘,限時完成,題目含線性代數、機率論、Markov Chain 等。據候選人反饋,有 1 道題目故意設計成無解,考察候選人面對不確定性的心態。
- Dev 方向:Codility 平臺,3 道程式設計題(Easy + Medium + Hard),覆蓋字串處理、貪心演算法、圖論匹配,約 2 小時。
完成視窗通常為 72 小時,建議選擇在安靜、網路穩定的環境下完整作答。
Step 03 Phone Screen
約 30 分鐘,主要聊背景動機(為什麼 DRW?為什麼 Quant?)及簡單的心算測試。節奏相對輕鬆,但要準備好清晰的 motivation statement。
Step 04 Technical Interview
由 Junior Quant Trader 或研究員主持,約 45 分鐘。考察機率統計、期望值計算、Market Making 邏輯,以及正態分佈、置信區間等基礎題。Quant Researcher 崗還會涉及 ML 模型問題。
Step 05 Superday
現場赴芝加哥(或 Zoom)進行,Day 1 下午報到 + 交流,Day 2 全天面試。涵蓋資料分析任務、Trading Game(撲克/骰子博弈)、背靠背技術面與行為面試。DRW 強調 Day 1 的社交活動對最終決策同樣重要,不建議缺席。
DRW / Codility 6 道真題分享
題目 1:遊戲生命值計算
題目描述
想象一個電子遊戲,玩家操控角色闖過多個關卡。角色的初始生命值為 initialHealth,生命值會隨著關卡程序發生變化。
給定一個整數陣列 deltas,表示每一關的生命值變化。第 i 關(從 0 開始計數)會讓角色當前的生命值變化 deltas[i]。
規則:
- 當角色的生命值變為小於 0 時,會立即被設定為 0。
- 當角色的生命值變為大於 100 時,會立即被設定為 100。
你的任務是:計算並返回角色闖過所有關卡後的最終生命值。
解題思路
直接模擬即可:
- 初始化
currentHealth = initialHealth - 遍歷
deltas陣列,每次更新currentHealth += deltas[i] - 每次更新後,將
currentHealth限制在[0, 100]之間 - 遍歷結束後返回
currentHealth
Java 實現
public class Solution {
public int solution(int initialHealth, int[] deltas) {
int current = initialHealth;
for (int delta : deltas) {
current += delta;
if (current 100) current = 100;
}
return current;
}
}
題目 2:匹配子陣列模式
題目描述
給定一個整數陣列 numbers 和一個表示比較模式的陣列 pattern,找出 numbers 中有多少個子陣列與給定的 pattern 匹配。
pattern 陣列中只包含以下整數:
pattern[i] = 1:對應位置的數字比前一個數字大pattern[i] = 0:對應位置的數字與前一個數字相等pattern[i] = -1:對應位置的數字比前一個數字小
題目保證 numbers.length > pattern.length。
解題思路
暴力匹配即可(滿足題目時間複雜度要求):
- 子陣列的長度必須為
pattern.length + 1 - 遍歷所有可能的起始位置
i,檢查從i開始的子陣列是否匹配pattern - 統計匹配的子陣列數量
Java 實現
public class Solution {
public int solution(int[] numbers, int[] pattern) {
int count = 0;
int m = pattern.length;
int n = numbers.length;
for (int i = 0; i <= n - m; i++) {
boolean match = true;
for (int j = 0; j < m; j++) {
int curr = numbers[i + j + 1];
int prev = numbers[i + j];
if (pattern[j] == 1 && curr = prev) match = false;
}
if (match) count++;
}
return count;
}
}
題目 3:矩陣繪製字母 Y
題目描述
給定一個 n × n 的正方形矩陣(n 為奇數),矩陣中只包含數字 0、1、2. You can change the numbers in any grid to 0、1 或 2。
The goal is to figure out how to draw the letters in the matrix Y 所需的最少修改次數。
字母 Y 的定義:
- 構成
Y的所有數字都相等:左上到中心的對角線、右上到中心的對角線、從中心垂直向下的所有格子。 - 所有不構成
Y的格子數字都相等,且與構成Y的數字不同。
解題思路
列舉所有 6 種可能的顏色組合,計算每種組合需要修改的格子數,取最小值:
Y=0, 背景=1/Y=0, 背景=2Y=1, 背景=0/Y=1, 背景=2Y=2, 背景=0/Y=2, 背景=1
Java 實現
Public class Solution {
public int solution(int[][] matrix) {
int n = matrix.length;
int center = n / 2;
boolean[][] isY = new boolean[n][n];
// Mark the position of Y
for (int i = 0; i < center; i++) {
isY[i][i] = true;
isY[i][n - 1 - i] = true;
}
for (int i = center; i < n; i++) {
isY[i][center] = true;
}
int[][] pairs = {{0,1}, {0,2}, {1,0}, {1,2}, {2,0}, {2,1}};
int minChanges = Integer.MAX_VALUE;
for (int[] pair : pairs) {
int yColor = pair[0];
int bgColor = pair[1];
int changes = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (isY[i][j]) {
if (matrix[i][j] != yColor) changes++;
} else {
if (matrix[i][j] != bgColor) changes++;
}
}
}
minChanges = Math.min(minChanges, changes);
}
return minChanges;
}
}
題目 4:數字翻轉配對
題目描述
Definition flipDigits Function: Reverse the numerical order of an integer and remove all leading zeros from the result.
例如:FlipDigits(5070) = 705,FlipDigits(800) = 8。
給定一個非負整數陣列 Arr,計算滿足以下條件的數對 (i, j) 的數量:
i ≤ jarr[i] + flipDigits(arr[j]) = arr[j] + flipDigits(arr[i])
解題思路
對等式變形:arr[i] - flipDigits(arr[i]) = arr[j] - flipDigits(arr[j])
因此,我們只需要統計每個 (x - flipDigits(x)) 值出現的次數,再用組合數計算即可。
Java 實現
import java.util.*;
public class Solution {
public long solution(int[] arr) {
Map countMap = new HashMap();
for (int x : arr) {
long key = x - flipDigits(x);
countMap.put(key, countMap.getOrDefault(key, 0L) + 1);
}
long total = 0;
for (long cnt : countMap.values()) {
total += cnt * (cnt + 1) / 2;
}
return total;
}
private long flipDigits(int x) {
long res = 0;
while (x > 0) {
res = res * 10 + (x % 10);
x /= 10;
}
return res;
}
}
題目 5:構造每個字母出現奇數次的字串
題目描述
Write a function that, given an integer N,返回一個由 N 個小寫字母(a-z)組成的字串,要求每個出現過的字母的出現次數都是奇數。
解題思路
- 當
N是奇數時:直接用N個'a'即可('a'出現奇數次)。 - 當
NWhen it is an even number: use(N-1)個'a'和 1 個'b'即可(兩個字母都出現奇數次)。
Python 實現
def solution(N):
if N % 2 == 1:
return 'a' * N
else:
return 'a' * (N - 1) + 'b'
Question 6: Minimum number of exchanges to minimize the difference between two numbers
題目描述
給定兩個數字字串 S 和 T,可以交換對應位置上的數字,目標是讓兩個數的差的絕對值儘可能小,求最小交換次數。
解題思路
Dynamic programming: bit-by-bit processing, maintaining the minimum number of exchanges of the three states:
dp[0]: The current two number prefixes are exactly equaldp[1]:當前S字首比T字首大dp[2]:當前S字首比T字首小
Java 實現
public class Solution {
public int solution(String S, String T) {
int n = S.length();
int[] dp = new int[]{0, n + 1, n + 1};
for (int i = 0; i bVal) next[1] = Math.min(next[1], dp[0] + cost);
else if (aVal < bVal) next[2] = Math.min(next[2], dp[0] + cost);
else next[0] = Math.min(next[0], dp[0] + cost);
}
if (dp[1] != Integer.MAX_VALUE) next[1] = Math.min(next[1], dp[1] + cost);
if (dp[2] != Integer.MAX_VALUE) next[2] = Math.min(next[2], dp[2] + cost);
}
}
Recommended exam preparation resources
- Tradermath.org:心算與機率題庫
- A Practical Guide to Quant Finance Interviews(綠皮書)
- LeetCode / Codility:Dev Track 必備
- Kaggle:Python 資料分析練習
- DRW 官方備考指南
額外推薦: 如果你想系統提升 OA 透過率和麵試表現,強烈建議瞭解 Programhelp。他們的學長提供專業的 OA 實戰輔助 、真題預測、程式碼最佳化以及高強度模擬面試,能幫你快速補齊弱點,顯著提高備考效率。
有需要的同學可以直接聯絡 Programhelp 詳談,他們會根據你的情況給出針對性方案。