题目描述
化简 Unix 绝对路径:. 表示当前目录、.. 表示上一级、多个斜杠合并。
path = "/a/./b/../c"
输出 = "/a/c"
思路解析
先把路径按 / 切成几段。遇到普通目录名就入栈;遇到 .. 就弹出栈顶(回上级);遇到 . 或空串就忽略。最后把栈里的目录用 / 连起来。
读 "a" · 入栈:第一段是普通目录 a,入栈。栈:[a]。
读 "." · 忽略:读到 .,表示「当前目录」,啥也不做,栈不变。
读 "b" · 入栈:普通目录 b,入栈。栈:[a, b]。
读 ".." · 弹栈:读到 ..,回到上一级:弹出栈顶 b。栈变回 [a]。
读 "c" · 入栈:普通目录 c,入栈。栈:[a, c]。
拼接结果:所有段处理完,把栈里 [a, c] 用 / 连起来、前面加根 /,得 "/a/c"。
凡是「进入一层 / 退回一层」的结构(目录、括号、撤销操作),栈都是最自然的工具:入栈深入,弹栈回退。
参考代码(Python)
Python
1stack = []
2for part in path.split(class="cl-str">"/"): # 按 / 切开
3 if part == class="cl-str">"" or part == class="cl-str">".": # 空段 / 当前目录
4 continue
5 elif part == class="cl-str">"..": # 回上级
6 if stack: stack.pop()
7 else: stack.append(part) # 普通目录入栈
8return class="cl-str">"/" + class="cl-str">"/".join(stack)复杂度分析
- 时间复杂度:O(n) —— 每段处理一次
- 空间复杂度:O(n) —— 栈存目录
套路模板
记住骨架:切分 → 忽略项跳过 / 回退项弹栈 / 其余入栈 → 拼接。括号匹配、撤销重做都是同一类栈应用。
Python
1stack = []
2for token in 切分(input):
3 if 忽略(token): continue # 如 class="cl-str">"" / class="cl-str">"."
4 elif 回退(token): stack and stack.pop() # 如 class="cl-str">".."
5 else: stack.append(token) # 深入一层
6return 拼接(stack)易错点
- ❌ .. 时栈空还 pop → ✅ pop 前先判 stack 非空(根目录的上一级还是根,不能再退)
- ❌ 忘了处理连续 // 产生的空段 → ✅ 空串 "" 也要 continue(split 会产生空字符串)
以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握。