Optiver这个quant公司的OA比其他公司还是更难的,对逻辑思维要求比较高。之前做的都是三题,今年(2026)只有2题,简单分享一下 Optiver OA 两题。
Optiver OA
Q1
给定两个日期(分别由 year、month、day 表示,且保证第一个日期早于第二个),要求你在不使用系统日期类的前提下,计算这两个日期之间相差的天数。可以调用已提供的 DaysInMonth(month, year) 来获取某月天数,本质是考察你对闰年规则、月份天数、跨年累加的手动实现能力。

思路:第一题就是把日期都转换成从公元元年开始算的总天数,也就是把年、月、日都揉碎了算进一个大计数器里,中间注意闰年对二月和总天数的修正,最后拿两个大数字直接相减就行
代码
def DaysInMonth(month, year):
if month in [1, 3, 5, 7, 8, 10, 12]: return 31
if month in [4, 6, 9, 11]: return 30
return 29 if (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)) else 28
def NumDaysBetween(year1, month1, day1, year2, month2, day2):
f = lambda y, m, d: d + sum(DaysInMonth(i, y) for i in range(1, m)) + (y-1)*365 + (y-1)//4 - (y-1)//100 + (y-1)//400
return f(year2, month2, day2) - f(year1, month1, day1)Q2
输入是一组无序的父子节点对(如 (A,B)),表示一棵二叉树,你需要先判断该结构是否为合法二叉树(检查格式错误、重复边、父节点超过两个子节点、多根、环等),若有错误按优先级输出错误码(E1~E5);若无错误,则构建该树并输出其字典序最小的 S 表达式(即对子节点按字母排序递归输出),本质是一个结合了图建模 + 错误校验 + 树构造 + DFS序列化的综合题。


思路:先把输入按括号拆开,通过检查重复项、数每个点的孩子和爹的数量来挨个排除错误类型,最后只要确定只有一个根节点且没环,就从根节点开始按字母顺序递归拼接出那个带括号的字符串。
代码
import sys, re
def main():
r = sys.stdin.read()
if not r: return
s = r.rstrip('\n\r')
if '\n' in s or '\r' in s or s.strip() != s or not re.match(r"^(\([A-Z],[A-Z]\) )*\([A-Z],[A-Z]\)$", s):
print("E1")
return
p = re.findall(r"\(([A-Z]),([A-Z])\)", s)
if len(set(p)) < len(p):
print("E2")
return
a, i, n = {}, {}, set()
for u, v in p:
n.add(u)
n.add(v)
a.setdefault(u, []).append(v)
i.setdefault(v, []).append(u)
for u in a:
if len(a[u]) > 2:
print("E3")
return
rs = sorted([k for k in n if k not in i])
if len(rs) > 1:
print("E4")
return
if not rs:
print("E5")
return
for k in i:
if len(i[k]) > 1:
print("E5")
return
rt, v = rs[0], set()
def h(u):
v.add(u)
for x in a.get(u, []):
h(x)
h(rt)
if len(v) < len(n):
print("E5")
return
def f(u):
c = sorted(a.get(u, []))
return "(" + u + "".join(f(x) for x in c) + ")"
print(f(rt))整体下来用例都通过了,Optiver 有oa vo都可以来问,各个公司都比较经验。求职辅导服务是时间和质量的权衡。咨询interview Aid,获取最专业的科技求职辅导。
正文完