Akuna Capital C++ SDE 2026NG OA 复盘:80 分钟 3 题如何稳过?(含可直接套用的解题模板)

这场 OA 的典型特征是:题目描述很长、算法本身不难、时间极紧。 核心不是“会不会做”,而是“能不能在有限时间内稳定拿分”。

目录

题目全景与时间分配

已知信息:80 分钟 3 题。 体感难点:描述冗长、第二题实现细节多、时间紧。

建议分配:

  • Q1:20 分钟(读题 + 浮点边界)
  • Q2:40 分钟(数据结构设计 + 操作正确性)
  • Q3:15 分钟(滑窗模板快速落地)
  • 预留:5 分钟(自测样例)

执行原则:

  • 先写“可运行正确版”,再做常数优化。
  • 每题先列 3 条边界再开写,避免返工。
  • 第二题不要过度工程化,买卖两套结构直接分开维护。

Q1:价格对齐 Tick(浮点数与负数处理)

题意抽象:

  • 给定多个价格区间 [low, high],每段有 width
  • 输入 price,映射到合法 tick。
  • price < min_price,直接返回 min_price
  • 若在某区间内,找 low + n * width 中与 price 距离最小者。
  • 数据大量是 double,且可能出现负数。

高频坑位:

  • double 比较误差导致边界判断错位。
  • round 在临界值处行为不稳定,最好补邻点比较。
  • 负价格时仍然按同一公式处理,不要写分支特判。
from dataclasses import dataclass
import math

EPS = 1e-9

@dataclass
class TickBand:
    low: float
    high: float
    width: float

def adjust_price(price: float, bands: list[TickBand], min_price: float) -> float:
    if price < min_price:
        return min_price

    for b in bands:
        if b.low - EPS <= price <= b.high + EPS:
            raw = (price - b.low) / b.width
            left_n = math.floor(raw)
            right_n = left_n + 1

            left = b.low + left_n * b.width
            right = b.low + right_n * b.width

            candidates = []
            if b.low - EPS <= left <= b.high + EPS:
                candidates.append(left)
            if b.low - EPS <= right <= b.high + EPS:
                candidates.append(right)

            if not candidates:
                return price

            # 距离相同取更小值,保证确定性
            return min(candidates, key=lambda x: (abs(x - price), x))

    return price

复杂度:

  • 单次查询 O(k)k 为区间数。
  • 若查询很多,可先按区间有序存储并二分到 O(log k)

Q2:订单簿维护(买卖分离)

题意抽象:

  • 三种操作:买入、卖出、取消(买/卖)。
  • 维护买和卖各自的“最优价格 + 该价格总需求量”。
  • 买卖不撮合,不做抵消。
  • 本质是两个互不影响的数据结构。

最佳实现:

  • 买盘:最大堆 + price -> qty 哈希。
  • 卖盘:最小堆 + price -> qty 哈希。
  • 取消时只改哈希,查询 best 时懒删除堆顶失效元素。
import heapq
from collections import Counter

class SideBook:
    def __init__(self, is_buy: bool):
        self.is_buy = is_buy
        self.qty = Counter()
        self.heap = []

    def add(self, price: float, amount: int) -> None:
        self.qty[price] += amount
        heapq.heappush(self.heap, -price if self.is_buy else price)

    def cancel(self, price: float, amount: int) -> None:
        if self.qty[price] <= amount:
            self.qty.pop(price, None)
        else:
            self.qty[price] -= amount

    def best(self) -> tuple[float | None, int]:
        while self.heap:
            p = -self.heap[0] if self.is_buy else self.heap[0]
            if self.qty.get(p, 0) > 0:
                return p, self.qty[p]
            heapq.heappop(self.heap)
        return None, 0

复杂度:

  • add/cancel 近似 O(log n)
  • best 摊还 O(log n)

Q3:滑动窗口(送分题思路)

原题细节缺失,但面经提示“滑窗秒杀”。 这类题通常是“最长/最短满足条件子数组”。

通用模板:

  • 双指针维护窗口 [l, r]
  • r 扩张,条件不满足时移动 l 收缩。
  • 每次更新答案。

这题策略是:不追求花哨结构,优先把模板敲对拿满分。

2026 上岸案例:8 天冲刺拿下量化岗

候选人:陈同学,杭州,3 年 C++ 后端经验。 时间:2026 年 1 月。 问题:算法不弱,但 OA 常因读题慢和边界遗漏导致超时。

我们给的方案:

  • Day 1:30 题“长描述题”快速抽象训练。
  • Day 2-4:订单簿 + 浮点数专题,固定模板默写。
  • Day 5:80 分钟全真模考,严格计时复盘。
  • Day 6-7:错题回炉,只修“会丢分”的边界。
  • Day 8:最终冲刺清单 + 提交前自测脚本。

结果:

  • OA 3 题全部完成并通过。
  • 两周后进入下一轮,最终拿到 2026 NG 相关量化开发 offer。

一页纸备考清单

  • 浮点比较统一使用 EPS
  • 所有“价格档位”题先写 tie-break 规则。
  • 订单流题默认“堆 + 哈希 + 懒删除”。
  • 第三题见到区间统计先想滑窗。
  • 提交前至少手测:最小值、边界值、空结构、负数。

面试救急

你如果一周内就要做 OA,优先做这三件事:

  • 把 Q1/Q2 模板手写到 10 分钟内可完成。
  • 按 80 分钟做 2 套全真计时题。
  • 找人做一次“只挑扣分点”的复盘。

限时服务内容:

  • 1v1 代码走查(聚焦边界和时间管理)
  • 目标岗位题库匹配
  • 48 小时内给出可执行改进清单
Previous
Previous

Ivo 在线笔试 Quilgo 图形推理全复盘:40 分钟高分策略、Python 训练脚本与 2026 上岸案例

Next
Next

Aquatic QR Summer Intern 2026 OA 复盘:45 分钟滑动窗口题高分写法 + One-Way Interview 过关模板(含 Python)