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 小时内给出可执行改进清单