最近遇到一道 Adobe 面试真题,难度中偏上,主要考察 系统设计 + 算法调度 + 数据结构 的综合能力。
做系统设计的同学一定要掌握!
📌 题目
实现一个 Round-Robin(轮询)负载均衡器,用于将请求分配到
n个服务器上。
- 共有 n 个服务器(编号从 1 到 n)
- 共 m 个请求,每个请求的:
- 到达时间:arrival[i]
- 执行时间:burstTime[i]
🎯 分配规则:
- 请求到达时,把它分给 当前可用的编号最小的服务器
- 服务器从接到请求开始,到 arrival[i] + burstTime[i] 时间点内都不可用
- 如果多个请求同一时间到达,按原顺序处理
- 如果没有服务器可用,返回
-1(表示被丢弃)
📤 输出:长度为 m 的数组
记录每个请求被哪个服务器处理(1-based),若被丢弃返回 -1
🧠 示例
n = 3
m = 5
arrival = [2, 4, 1, 8, 9]
burstTime = [7, 9, 2, 4, 5]
输出: [2, 1, 1, 3, 2]
| 请求序号 | 到达时间 | 执行时间 | 结果 |
|---|---|---|---|
| 3 | 1 | 2 | server 1 |
| 1 | 2 | 7 | server 2 |
| 2 | 4 | 9 | server 1 |
| 4 | 8 | 4 | server 3 |
| 5 | 9 | 5 | server 2 |
🧩 题目考点总结
| 考点 | 说明 |
|---|---|
| 优先队列 / 小顶堆 | 维护最早空闲且编号最小的 server |
| 事件流思维 | 按时间推进模拟任务调度 |
| System Design 基础 | 负载均衡的核心思想 |
| 并发调度 & 资源管理 | 怎么处理冲突和等待队列 |
🔑 关键解法思路:
- 使用一个最小堆
busy维护正在运行的任务(记录结束时间 & 服务器编号) - 使用一个最小堆
free维护当前空闲服务器(按编号排序) - 按请求时间前进,把已完成任务释放回 free
💡 面试中重点讨论方向
🤔 如果 m 和 n 都很大(10⁵级别)怎么办?
必须 O(m log n) 时间处理,暴力会超时
🎯 如果多个 region?多个 load balancer?
可以扩展到:
- 分层调度
- heartbeat 健康检查
- consistent hashing
📣 最后说一句
现在大厂面试对 系统设计 + 实战算法 要求越来越高,很多人不是不会写代码,而是:
不会面试策略,不会表达思路,不会拆解问题
如果你 有即将到来的面试 / 需要真题演练 / 想模拟真实场景
可以留言或私信:
📌 支持大厂 System Design / CodePair 现场辅助 / 语音实战演练
帮助你提升思维表达,让面试官看到亮点
➡️ 可以联系 CSOAHelp(我们提供高质量 OA/VO 面试辅助与全流程解析)。

