SWE · First Round Coding

Uber 员工组织关系:查询经理的所有跨层级下属

根据 Uber 第一轮面经中的组织树查询题,梳理 manager→employee 建图、跨层遍历、重复边和异常环检测,以及多次查询时的缓存取舍。

题目重点:根据 Uber 第一轮面经中的组织树查询题,梳理 manager→employee 建图、跨层遍历、重复边和异常环检测,以及多次查询时的缓存取舍。

题意与假设

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

  • 核心训练输入是一组 manager→employee 关系和一个待查询 manager ID;返回所有可达下属 ID,不包含经理本人。
  • 标准组织关系应无环;示例讨论重复边、一个人有多个上级和坏数据成环时用 visited 防止重复与死循环,但不把它们冒充题目明确约束。
  • 输出顺序若无要求可按任意稳定遍历顺序;若接口要求升序,遍历结果再排序。

解题路线

  1. 先遍历所有关系建立 manager→直接下属的邻接表;若同一条关系可重复出现,用集合或遍历 visited 去重。
  2. 从目标经理的直接下属入栈,逐个弹出;首次访问时记录 ID 并把它的下属入栈。DFS 或 BFS 都能覆盖全部跨层级节点。
  3. 目标经理若从坏数据环路回到自身,visited 要预先包含经理 ID,使其不进入结果。若题目要求严格验证组织树,应先检测环/多父并拒绝,而不是静默容忍。

手动走一遍

关系 A→B、A→C、B→D、C→D 时,从 A 出发可得到 B、C、D,D 只出现一次;若再有 D→A,防御遍历也不会把 A 算作自己的下属,但严格组织树验证会拒绝该输入。

规模与取舍

设员工/经理节点 V、关系 E。单次建图加遍历是 O(V+E) 时间、O(V+E) 空间;若结果要排序,再加 O(K log K),K 为返回 ID 数。多经理高频查询可缓存闭包,但组织关系更新时须失效,最坏空间可能达 O(V²)。

易错点与追问

容易失分的边界

  • 只返回直接下属会漏掉跨层级关系;递归 DFS 处理很深的链可能溢出调用栈,迭代栈更稳妥。
  • visited 是防御措施,不等于业务上允许一个员工有多个直属经理或组织成环;产品约束应单独验证。
  • 权限过滤是另一层问题,题目并未要求;真实 HR 数据接口需要在授权上下文下过滤,但不能把过滤规则凭空写入原题。

继续深挖

  • 若仅查询下属人数,预先验证为树后可做一次后序 DP 得到每个经理的子树规模,查询 O(1)。
  • 若组织图频繁变化且需强一致,更新关系时验证环与多父,查询时读取同一个组织版本;缓存需按版本失效。
✓已复制微信号!