SDE II · VO Coding / OOD

Microsoft 十字路口交通灯控制器:状态机、防冲突与行人灯

从通行相位派生灯色,用互斥冲突表和过渡相位阻止交叉方向同绿,再加入行人请求。

题目重点:从通行相位派生灯色,用互斥冲突表和过渡相位阻止交叉方向同绿,再加入行人请求。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练路口为南北直行、东西直行两组互斥机动车相位,另有与机动车冲突的行人过街相位;真实左转和右转需扩展冲突表。
  • 所有灯由唯一控制器发布同一版本的相位快照;灯的实际硬件反馈属于另一个安全层,题目未明确。
  • 相位转换先进入全红清空区,再进入下一绿相位;最短/最长绿灯及黄灯秒数须由交通工程配置。
  • 行人按钮是请求,可延后到安全相位;不能以按钮事件直接把行人灯设绿。

解题路线

  1. 定义内部状态 NS_GREEN、NS_YELLOW、ALL_RED、EW_GREEN、EW_YELLOW、PED_GREEN、PED_FLASH 等;渲染函数 render(phase) 唯一地派生所有灯色和倒计时。
  2. 用 phase 的允许 movement 集合及对称 conflict(a,b) 表定义安全不变量:任意同一快照中两个冲突 movement 不同时获准通行。
  3. 定时器或请求只触发合法状态转移;从机动车绿转下一个冲突绿时强制黄灯与全红清空,相位切换用单线程事件循环或带版本 CAS 的串行状态机。
  4. 排队记录行人请求;在安全边界选行人相位,并设最长等待上界和最短步行/清空时长。请求取消与重复按同一轮服务去重。
  5. 输出前校验版本和冲突不变量;开机、看门狗超时或硬件反馈不一致时进入预定安全模式,并记录故障。真实 fail-safe 模式由当地设备规范决定。

手动走一遍

NS_GREEN 时南北直行为绿、东西与冲突行人均红。行人按钮到达只置 pending=true;到期后 NS_YELLOW→ALL_RED,清空完成才进入 PED_GREEN。若从两个客户端同时请求东西绿和行人绿,控制器串行选择下一相位,不能各自直接改灯色。

规模与取舍

固定小路口每次事件 O(P+M²) 足以检查 P 个相位、M 个 movement 的冲突表;实际 P、M 为常数。事件率低,正确性瓶颈在时钟、原子发布和硬件故障检测,而非算法吞吐。

易错点与追问

容易失分的边界

  • 遍历灯色数组并逐个切换,中途可能出现冲突方向同绿。
  • 把行人按钮当立即亮绿命令。
  • 绿灯直接切换到相冲突绿灯,没有黄灯和清空相位。
  • 把软件状态正确误称为硬件必然安全。

继续深挖

  • 左转保护相位和右转礼让行人怎样进冲突矩阵?
  • 传感器故障或控制器重启后应进入什么安全相位?
  • 如何性质测试所有合法状态转移都不违反互斥不变量?
  • 行人请求很多时怎样兼顾最大等待时间和机动车吞吐?
✓已复制微信号!