前两天,我们一位学员刚刚完成了 Stripe OA ,顺利全 AC。第一时间来和大家复盘一下。Stripe 的 OA 一直以“细节繁琐”著称,这次也不例外:题目难度中等,但 case 多达 17 个,还隐藏了不少 tricky 场景。要是光靠刷题的直觉,很容易因为一个细节掉坑。
学员背景
这位学员在国外一所排名中等的大学读硕士,专业是计算机方向。学校名气不算大,在找实习和全职机会时,竞争压力明显更大。平时也有在刷题,但大多数是常规的算法题,对于 Stripe 这种 业务场景化 + 一堆细节约束的 OA,练习机会不多。
之前他独立做过几次 OA,总是会掉在隐藏 case 上:要么是日志格式没对齐,要么是边界条件写漏了。眼看着身边的同学有的顺利进面,他不想再因为细节失误而错失机会,于是找到我们 Programhelp,希望借助 OA 无痕联机 + 语音助攻,保证这次能稳稳通过。
Stripe OA 题目概述
这次 OA 一共一道大题,时间 60 分钟。题目背景设定在 Stripe 的 Notebook 平台(基于 Jupyter),因为用户多会卡顿,所以要实现一个“负载均衡器”,把请求路由到不同的 server。
题目分为五个部分,从最基础的 load balancing 到后面引入 disconnect / shutdown / max connections,最后需要我们实现一个完整的路由器。
Question 1
The notebook platform at Stripe is based on Jupyter, which does not perform well with a large number of users. To ensure a good experience for our developers, we run multiple Jupyter servers and direct different developers to different servers depending on load.
For this multi-part question, we will be writing a “load balancer” to direct requests based on current load. In particular, the requests are “websocket” requests which create a persistent connection to a Jupyter server, the connection itself representing a continuous load on the server. We won’t actually be routing any requests over the network; instead, we will simply implement a function to handle requests that determines the target server. The implementation is broken down into five parts.
Function parameters:
int numTargets: the number of Jupyter servers.int maxConnectionsPerTarget: the maximum number of active connections allowed on a target server (used in Part 4).string requests[n]: lines for each incoming request.
Returns:
string[n]: a log of each CONNECT request. Each log indicates the target using the schemaconnectionId,userId,targetIndex. Note thattargetIndexis 1-based.
然后逐步增加复杂度:
- Part 1: 基础 load balancing(选择当前连接最少的 server,tie-break 选 index 小的)。
- Part 2: 增加 DISCONNECT,需要根据
connectionId找到对应 server 并删除。 - Part 3: 增加 SHUTDOWN,关机 server 要排除在分配范围之外。
- Part 4: 引入
maxConnectionsPerTarget,达到上限的 server 不能再分配。 - Part 5: 综合考察,保证日志只对 CONNECT 输出,其他操作只维护内部状态。
我的解题思路
一开始觉得挺简单的:就是一个最小负载的选择问题,用几个 set/map 来维护就行。但做到后面发现隐藏 case 特别多,最后代码写了 100 多行。
我的整体思路是模块化:
- CONNECT
- 遍历所有 server,找到连接数最小的那个。
- tie-break 按照 server index 升序。
- 分配成功后要记日志:
connId,userId,targetIndex。
- DISCONNECT
- 根据
connectionId找到之前分配的 server。 - 删除映射并减少 server 的负载。
- 根据
- SHUTDOWN
- 把该 server 标记为关闭状态,后续不能再分配。
- 已经在该 server 上的连接也要全部清理。
- maxConnectionsPerTarget
- 选 target 的时候要判断负载是否超过上限。
- 如果所有 server 都满了,这个请求就相当于 reject。
- 日志
- 只有 CONNECT 才需要输出日志,其余都只是更新内部状态。
常见问题解答(FAQ)
Q1:Stripe OA 难度大吗?
A:整体算法难度不高,主要是模拟和状态维护。但 case 特别多(十几个 + 隐藏 case),细节要求严格,稍有疏忽就 AC 不全。
Q2:为什么很多人写不完?
A:主要是时间分配和边界条件。Stripe OA 喜欢出一堆“杂七杂八”的要求,比如 tie-break、断链逻辑、关机后清理连接、maxConnections 限制等等。如果不模块化拆解,写到后面容易乱套。
Q3:OA 无痕联机是什么?
A:就是我们 Programhelp 提供的远程实时协助方式,全程不留痕迹,帮学员在 OA 环境里安全顺利完成代码,实现 100% 过测。
Q4:Programhelp 在 OA 中能提供哪些帮助?
A:
- 无痕联机:确保所有 test case 一次性 AC;
- 语音助攻:学员卡壳时即时点拨关键思路;
- 逻辑梳理:帮你模块化写题,避免细节错误。
Q5:除了 Stripe,其他大厂 OA 也能帮吗?
A:可以的。无论是 HackerRank、CodeSignal、Codility、还是各大厂自研平台(Amazon、Meta、Google、Snowflake 等),我们都有实战经验,能提供同样的无痕联机 + 语音助攻支持。
别再羡慕别人了,大厂 Offer 其实没你想的那么遥远
很多同学和这位学员一样,平时刷题也能做对大部分题,但一到真正的 OA 环境,压力大、时间紧、细节要求又多,很容易因为一个小 bug 或没注意到的边界条件,导致测试用例没过全。大厂的 OA 就是这样,哪怕只差一个 case,也可能直接被卡掉。
如果你也在准备大厂 OA,不想因为细节问题卡在隐藏 case 上,Programhelp 提供的 OA 无痕联机辅助 + 实时语音助攻,能让你稳稳通过所有测试用例,拿到后续面试机会。