SWE · Phone Screen Coding

Uber Print Directory:按层级缩进输出目录树

Uber Phone Screen 给 root directory 和目标缩进格式;用前序遍历打印子目录/文件,并厘清输入顺序、深度、环和输出长度。

题目重点:Uber Phone Screen 给 root directory 和目标缩进格式;用前序遍历打印子目录/文件,并厘清输入顺序、深度、环和输出长度。

题意与假设

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

  • 输入是一棵根目录树;每个节点有 name、children,文件没有 children。输出为前序顺序,每一行是 depth 个缩进标记再加节点名。
  • 沿用输入 children 顺序;若面试官要求文件优先或字典序,先在每个目录内排序,不能默认。
  • 题目用箭头展示层级,具体空格/箭头字符并非可验证的机器判题格式;示例用统一的两空格缩进。

解题路线

  1. 显式栈存 (node,depth),初始根深度 0。每次弹出节点,输出缩进加 name。
  2. 按 children 逆序入栈,使弹出顺序与原 children 顺序一致;文件 children 为空自然只输出一行。
  3. 若真实输入是文件系统路径而不是内存树,应先明确符号链接、权限错误和目录读取顺序;若允许 symlink 回环,需按 inode/规范路径做循环检测。

手动走一遍

root 下有 subdir1(含 file1 和 subsubdir1)及 subdir2。输出 root、缩进一级的 subdir1、缩进两级的 file1 与 subsubdir1,再输出一级的 subdir2。每个节点恰输出一次。

规模与取舍

N 个节点、最大深度 H、输出字符总数 L:遍历节点 O(N),写出文本至少 O(L);显式栈最坏 O(N)(宽层),若逐节点构造 depth 次缩进,其成本已包含在 L。若每层排序,另加各节点子列表排序成本之和。

易错点与追问

容易失分的边界

  • 栈按原顺序压入子节点会使显示顺序反转;要逆序压栈或用递归按正序遍历。
  • 只看节点名猜文件/目录不可靠;应由节点类型或 children 契约决定。
  • 这题是从根打印整棵目录树,与 q22 根据 folder ID 查询单条根路径不同,不能合并成同一输出要求。

继续深挖

  • 若输出流很大,边遍历边写到 writer,避免先拼接整个字符串占 O(L) 内存;处理写失败的传播。
  • 若目录可并发修改,明确要快照视图还是允许边遍历边变化;稳定快照需要版本/锁或文件系统层保障。
✓已复制微信号!