目录
正在加载目录...

Hudson River Trading OA|CodeSignal 四题 20 分钟 AC

Hudson River Trading OA 刚做完,四道题,CodeSignal 平台,大约 20 分钟全部过了。进去之前预期会很难,实际上这次四道题的难度都在 Easy 到 Medium 之间,考的是基础实现能力而不是偏门算法。但根据外部资料,HRT 不同岗位和批次的题目差异很大——oavoservice 的 HRT OA 分析指出”通过分数线通常是 500/600,SDE 和 Algo Dev 岗位要求 560+,Quant Researcher 岗位要求满分加 bonus 题”,所以不能掉以轻心。

Hudson River Trading OA|CodeSignal 四题 20 分钟 AC

第一题:数位乘积减数位和

Hudson River Trading OA|CodeSignal 四题 20 分钟 AC

题意

给定正整数 n,计算各位数字的乘积减去各位数字的和,返回 product – sum(注意顺序不能反)。

示例:n = 123456 → 乘积 720,和 21 → 答案 699;n = 1010 → 乘积 0,和 2 → 答案 -2。

约束:1 ≤ n ≤ 1e9。

思路

按位拆解,含 0 时乘积直接变 0,注意返回值可能为负数。

def solution(n):
    prod, s = 1, 0
    while n:
        d = n % 10
        prod *= d
        s += d
        n //= 10
    return prod - s

时间 O(log n),常数极小。这题是热身题,一到两分钟拿下,不要在这里耽误时间。

第二题:最长连续相同字符子串

Hudson River Trading OA|CodeSignal 四题 20 分钟 AC

题意

给定小写字符串 source,找最长的连续相同字符子串。若有多段长度相同,取最右边那一段。返回格式为”字符 + 长度”,如 “c3″。

示例:”bbacccdbbab” → “c3″;”bbaacaa” → “a2″(取右侧的 aa)。

思路

一次线性扫描,维护当前游程长度和全局最优。

关键细节:只有当前长度严格大于全局最优时才更新——这样相等长度时自然保留更靠右的那段,不需要额外处理。

def solution(source):
    best_ch, best_len = source[0], 1
    cur_ch, cur_len = source[0], 1
    for c in source[1:]:
        if c == cur_ch:
            cur_len += 1
        else:
            cur_ch, cur_len = c, 1
        if cur_len > best_len:  # 严格大于,相等不更新 → 保留右边
            best_ch, best_len = cur_ch, cur_len
    return f"{best_ch}{best_len}"

时间 O(n)。”最右边”这个条件容易在这里翻车,用 > 不用 >= 是关键。

第三题:矩阵按层排序并顺时针回填

Hudson River Trading OA|CodeSignal 四题 20 分钟 AC

题意

定义矩阵的 k-border:去掉外层 k 圈后,当前最外一圈(上下左右边)。

对每一层 border,把该层元素排序后按顺时针(从左上角开始)写回原位置,使每层都是升序顺时针排列。

思路

按层迭代:

  1. 提取当前层四个边的元素(注意四角不要重复取)
  2. 排序
  3. 按顺时针顺序依次写回

单行/单列等退化情况要特判,避免重复操作同一元素。

def solution(matrix):
    n, m = len(matrix), len(matrix[0])
    top, bottom, left, right = 0, n-1, 0, m-1
    while top <= bottom and left <= right:
        # 提取当前层元素(顺时针)
        border = []
        for c in range(left, right+1): border.append(matrix[top][c])
        for r in range(top+1, bottom+1): border.append(matrix[r][right])
        if top < bottom:
            for c in range(right-1, left-1, -1): border.append(matrix[bottom][c])
        if left < right:
            for r in range(bottom-1, top, -1): border.append(matrix[r][left])
        border.sort()
        # 按顺时针写回
        idx = 0
        for c in range(left, right+1): matrix[top][c] = border[idx]; idx+=1
        for r in range(top+1, bottom+1): matrix[r][right] = border[idx]; idx+=1
        if top < bottom:
            for c in range(right-1, left-1, -1): matrix[bottom][c] = border[idx]; idx+=1
        if left < right:
            for r in range(bottom-1, top, -1): matrix[r][left] = border[idx]; idx+=1
        top+=1; bottom-=1; left+=1; right-=1
    return matrix

时间 O(n·m·min(n,m)),符合题面要求。退化情况(单行或单列)靠 if top < bottom 和 if left < right 的判断处理,不处理这两个条件会重复操作同一元素。

第四题:双数组配对查询 + 更新

Hudson River Trading OA|CodeSignal 四题 20 分钟 AC

题意

给定数组 a、b,以及若干查询:

[0, i, x]:把 a[i] 改成 x;[1, x]:统计满足 a[i] + b[j] = x 的 (i, j) 对数。

按顺序处理,返回所有类型 [1, x] 的结果。

思路

对 b 建哈希表(频率计数),之后不需要再动。

查询 [1, x]:遍历 a,对每个 a[i] 查 x – a[i] 在 b 中的次数并累加,O(|a|) 单次查询。

更新 [0, i, x]:直接改 a[i],O(1)。

from collections import Counter

def solution(a, b, queries):
    cnt_b = Counter(b)
    res = []
    for q in queries:
        if q[0] == 0:
            a[q[1]] = q[2]
        else:
            x = q[1]
            res.append(sum(cnt_b[x - v] for v in a))
    return res

b 建一次 Counter 之后不用再动,因为 b 不会被修改——这是这道题最重要的观察。如果 a 的规模很大同时查询很多,可以同时维护 a 的 Counter,但这次的数据规模下不需要。

HRT 面试完整流程参考

根据 HRT 官方面试指南,SWE 岗的完整流程是:

Take-Home Test(OA):HackerRank 或 Codility 平台(这次是 CodeSignal),限时,可以使用参考资料(书/网络)。HRT 官方说明”Coding style isn’t super important for this challenge”,通过率是真正的筛选标准。oavoservice 的 HRT OA 分析指出通过分数线通常是 500/600,SDE 和 Algo Dev 岗需要 560+。

Phone Screen(约两轮,各 45 分钟):分两种——技术讨论轮(Systems/Data Structure/Problem Solving)和编程轮(部分岗位限定 C++ 或 Python,部分自选)。Glassdoor 真实记录里提到”phone screen was a deep dive on python fundamentals”,以及 Wall Street Oasis 面经里记录了”expected value question involving order statistics”——数学概率是电面的真实高频考点。

Onsite(多轮背靠背):

编程技能——HRT 官方说考察”idiomatic code that uses modern syntax, makes optimal use of resources, is well-encapsulated, easy to read”,不只是写对,代码质量本身是评分维度。

系统级知识——内存、I/O、进程管理的基础知识。

问题拆解能力——面对不会的问题,能不能增量地向答案推进。

协作和沟通——HRT 是极度协作的公司(官方原话”extremely collaborative firm”),愿不愿意接受提示、有没有开放性是真实评分维度。

整体从 OA 到 Offer 大约 2 到 6 周,各 team 流程有差异,以 recruiter 的告知为准。

大多数人备考方向就错了

HRT 这套 OA 的题型在量化公司里算偏基础的,但电面的数学概率题才是真正的门槛——大多数候选人在 OA 上花了大量时间,Phone Screen 的期望值和概率题却完全没准备。InterviewShow 长期跟进 HRT、Two Sigma、Jane Street 这类量化公司的完整面试链路,从 OA 到 Phone Screen 的概率题都有覆盖,有需要的来聊。

END