面经 | Applied AI / 后端 | 🔥🔥 | OpenAI
2026(10月) Software Engineer, Implicit Signals @ OpenAI | San Francisco, CA · 电面 · 1 轮 | 😐 Neutral | Medium-Hard
电面 — Coding
coding 是一道四问往上加的题,做完一问才给下一问,Python。
第一问:给 n 条 (score, label),label 是 0/1,选一个阈值 t,score >= t 判正,求 accuracy 最高的 t。按 score 排序,从左往右扫,左边的判负右边的判正,维护左边 neg 个数和右边 pos 个数。第一版没管 score 相同的情况,两条同分的被切到了阈值两边,他给了个同分例子,改成同分的一起挪。
第二问:人工复核会把某条的 label 翻过来,flip(i) 之后要能马上返回当前最好的 t。我先说每次翻完重新扫一遍,O(n)。他问 flip 很多、n 很大怎么办。想了一会,score 不变,排序位置是固定的,变的只是那一个位置的值。左边判负对的是 neg,右边判正对的是 pos,把 neg 记 +1、pos 记 -1,accuracy 就是总 pos 数加上左边这一段的和,要的是最大前缀和。线段树每个节点存区间和跟最大前缀和,合并是 max(L.pre, L.sum + R.pre),flip 改一个叶子往上更新。他让顺便返回取到最大时的位置,在节点里多存了个下标,同分那块又拿出来讲了一下,只能在同分组的边界上切。
第三问:两个阈值 low < high,中间这段不判,转人工,每条成本 c,最大化 正确数 - c * 转人工数,flip 照样要支持。想到节点里还得存最大后缀,左边一段判负,右边一段判正,中间每条 -c。合并的时候最优切法可能左右两个阈值都在左子树、都在右子树,或者一边一个。一边一个那种拼出来了,用左子树的「前缀 + 中间」和右子树的「中间 + 后缀」。两个都落在同一边、另一边整段当中间的情况,要多存「前缀 + 中间整段」这种量,节点要存哪几个字段没列全,写了一半。
第四问:新样本不断进来,score 事先不知道,不能先排好建树。说了离线的话可以先收齐所有 score 压坐标,在线的只能换平衡树或者动态开点,到点了没写。