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

DRW Recruiting Timeline
Step 01 Online application
Submit your application on the DRW official website and receive an OA invitation within about 1 week. Some positions support employee referral, which can speed up the process. It is recommended that the resume highlight mathematics competitions, programming projects, or quantitative research experience.
Step 02 OA
- Quant direction: 6 mathematics/statistics questions, about 45 minutes to complete within a time limit, including linear algebra, probability theory, Markov Chain, etc. According to feedback from candidates, one question was deliberately designed to be unanswerable to examine the candidate's mentality in the face of uncertainty.
- Dev direction: Codility platform, 3 programming questions (Easy + Medium + Hard), covering string processing, greedy algorithm, graph theory matching, about 2 hours.
The completion window is usually 72 hours. It is recommended to complete the answer in a quiet environment with a stable network.
Step 03 Phone Screen
About 30 minutes, mainly talking about background motivation (Why DRW? Why Quant?) and a simple mental arithmetic test. The pace is relatively relaxed, but be prepared with a clear motivation statement.
Step 04 Technical Interview
Hosted by a Junior Quant Trader or Fellow, approximately 45 minutes. Examine probability statistics, expected value calculation, Market Making logic, as well as basic questions such as normal distribution and confidence interval. The Quant Researcher position will also cover ML model issues.
Step 05 Superday
Go to Chicago (or Zoom), Day 1 will be registration + communication in the afternoon, and Day 2 will be a full-day interview. Covers data analysis tasks, Trading Game (poker/dice game), back-to-back technical and behavioral interviews. DRW emphasizes that the social activities on Day 1 are equally important to the final decision and does not recommend absence.
DRW / Codility 6 real questions sharing
Topic 1: Game life value calculation
Question description
Imagine a video game in which a player controls a character through multiple levels. The character's initial health is InitialHealth, the health value will change as the level progresses.
Given an array of integers Deltas, indicating the change in health value at each level. No. I Off (counting from 0) will cause the character's current health to change Deltas[i].
Rule:
- When a character's health becomes less than 0, it is immediately set to 0.
- When a character's health becomes greater than 100, it is immediately set to 100.
Your task is: calculate and return the character's final health after passing all levels.
Problem-solving ideas
Just simulate it directly:
- Initialization
CurrentHealth = initialHealth - Traverse
DeltasArray, updated each timeCurrentHealth += deltas[i] - After each update, the
CurrentHealthLimited to[0, 100]Between - Return after traversal
CurrentHealth
Java implementation
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;
}
}
Question 2: Matching subarray patterns
Question description
Given an array of integers Numbers And an array representing the comparison pattern Pattern, find out Numbers How many subarrays are there with the given Pattern Match.
Pattern The array contains only the following integers:
Pattern[i] = 1: The number at the corresponding position is greater than the previous numberBigPattern[i] = 0: The number corresponding to the position and the previous numberEqualPattern[i] = -1: The number at the corresponding position is greater than the previous numberSmall
Question guarantee Numbers.length > pattern.length.
Problem-solving ideas
Violent matching is sufficient (meeting the time complexity requirements of the question):
- The length of the subarray must be
Pattern.length + 1 - Traverse all possible starting positions
I, check fromIDoes the starting subarray match?Pattern - Count the number of matching subarrays
Java implementation
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;
}
}
Question 3: Matrix drawing letter Y
Question description
Given a N×n The square matrix (N Is an odd number), the matrix contains only numbers 0,1,2. You can change the numbers in any grid to 0,1 Or 2.
The goal is to figure out how to draw the letters in the matrix Y The minimum number of modifications required.
Letter Y Definition:
- Constitute
YAll numbers are equal: the diagonal line from the top left to the center, the diagonal line from the top right to the center, and all squares vertically downward from the center. - All does not constitute
YThe grid numbers of are all equal, and they formYThe numbers are different.
Problem-solving ideas
Enumerate all 6 possible color combinations, calculate the number of grids that need to be modified for each combination, and take the minimum value:
Y=0, background=1/Y=0, background=2Y=1, background=0/Y=1, background=2Y=2, background=0/Y=2, background=1
Java implementation
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;
}
}
Topic 4: Number flipping matching
Question description
Definition FlipDigits Function: Reverse the numerical order of an integer and remove all leading zeros from the result.
For example:FlipDigits(5070) = 705,FlipDigits(800) = 8.
Given an array of non-negative integers Arr, calculate the number pairs that satisfy the following conditions (i,j) Quantity:
I ≤ jArr[i] + flipDigits(arr[j]) = arr[j] + flipDigits(arr[i])
Problem-solving ideas
Transformation of the equation:Arr[i] - flipDigits(arr[i]) = arr[j] - flipDigits(arr[j])
So, we only need to count each (x - flipDigits(x)) The number of times a value appears can be calculated using the number of combinations.
Java implementation
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;
}
}
Question 5: Construct a string in which each letter appears an odd number of times
Question description
Write a function that, given an integer N, returns a N Lowercase letters (A-z), it is required that the number of occurrences of each letter that appears is an odd number.
Problem-solving ideas
- When
NWhen it is an odd number: use it directlyNIndivual'a'That’s it ('a'Occurs an odd number of times). - When
NWhen it is an even number: use(N-1)Indivual'a'And 1'b'That's it (both letters appear an odd number of times).
Python implementation
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
Question description
Given two numeric strings S And T, you can exchange the numbers at the corresponding positions. The goal is to make the absolute value of the difference between the two numbers as small as possible and find the minimum number of exchanges.
Problem-solving ideas
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]:currentSPrefix ratioTBig prefixDp[2]:currentSPrefix ratioTSmall prefix
Java implementation
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: Mental arithmetic and probability question bank
- A Practical Guide to Quant Finance Interviews(Green Paper)
- LeetCode/Codility:Dev Track essential
- Kaggle: Python data analysis exercises
- DRW Official Exam Preparation Guide
Additional recommendation: If you want to systematically improve your OA pass rate and interview performance, it is highly recommended to learn about Programhelp. Their seniors provide professional OA practical assistance , prediction of real questions, code optimization and high-intensity mock interviews can help you quickly fill in your weaknesses and significantly improve the efficiency of exam preparation.
Students in need can directly contact Programhelp for details, and they will give you a targeted plan based on your situation.