DRW Online Assessment 全解析 | 真題拆解·備考策略

1,459Views

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

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。

你的任務是:計算並返回角色闖過所有關卡後的最終生命值。

解題思路

直接模擬即可:

  1. 初始化 currentHealth = initialHealth
  2. 遍歷 deltas 陣列,每次更新 currentHealth += deltas[i]
  3. 每次更新後,將 currentHealth 限制在 [0, 100] 之間
  4. 遍歷結束後返回 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

解題思路

暴力匹配即可(滿足題目時間複雜度要求):

  1. 子陣列的長度必須為 pattern.length + 1
  2. 遍歷所有可能的起始位置 i,檢查從 i 開始的子陣列是否匹配 pattern
  3. 統計匹配的子陣列數量

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 為奇數),矩陣中只包含數字 012. You can change the numbers in any grid to 012

The goal is to figure out how to draw the letters in the matrix Y 所需的最少修改次數。

字母 Y 的定義:

  1. 構成 Y 的所有數字都相等:左上到中心的對角線、右上到中心的對角線、從中心垂直向下的所有格子。
  2. 所有不構成 Y 的格子數字都相等,且與構成 Y 的數字不同。

解題思路

列舉所有 6 種可能的顏色組合,計算每種組合需要修改的格子數,取最小值:

  • Y=0, 背景=1 / Y=0, 背景=2
  • Y=1, 背景=0 / Y=1, 背景=2
  • Y=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) = 705FlipDigits(800) = 8

給定一個非負整數陣列 Arr,計算滿足以下條件的數對 (i, j) 的數量:

  • i ≤ j
  • arr[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' 出現奇數次)。
  • N When 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

題目描述

給定兩個數字字串 ST,可以交換對應位置上的數字,目標是讓兩個數的差的絕對值儘可能小,求最小交換次數。

解題思路

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 equal
  • dp[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 詳談,他們會根據你的情況給出針對性方案。

author avatar
Jory Wang Amazon資深軟體開發工程師
Amazon 資深工程師,專注 基礎設施核心系統研發,在系統可擴充套件性、可靠性及成本最佳化方面具備豐富實戰經驗。 目前聚焦 FAANG SDE 面試輔導,一年內助力 30+ 位候選人成功斬獲 L5 / L6 Offer。
END
 0