目录
正在加载目录...

Optiver SDE OA 2026 | Optiver OA 一亩三分地 | OA辅助 | 面试辅助

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,获取最专业的科技求职辅导。

正文完