题目描述
思路解析动画文字版
最直觉的办法是找到「目录加上级目录」这种片段直接删掉。但删完还要重新扫描,连续斜杠会制造空段,开头就是上级目录时又不能继续往上退。真正的难点是:上级目录只应该撤销最近进入的那一层。
栈顶永远是最近进入的目录。普通目录名入栈,表示深入一层;遇到上级目录就弹出栈顶,表示退回上一层;遇到当前目录或空段直接跳过。这样每一段只处理一次,不需要反复改字符串。
切分路径 · 固定处理对象:先把路径按斜杠切开。开头、连续斜杠和结尾斜杠会切出空串,这里用引号空串表示。接下来从左到右逐段处理。
读 a · 普通目录入栈:读到 a,普通目录名,入栈。栈就是当前路径,现在是 /a。
读空段 · 连续斜杠忽略:读到空串,它来自连续斜杠,不是目录,跳过。栈仍然是 /a。
读 b · 再深入一层:读到 b,入栈。路径深入到 /a/b,栈顶 b 就是最近进入的那一层。
读单点 · 当前目录不动:读到单点,它表示「当前目录」,既不深入也不回退。画面不变,栈顶仍然是 b。
读上级目录 · 先看栈顶:读到上级目录,要回退一层。最近进入的是谁?就是栈顶 b。先看清楚,下一帧再弹。
读上级目录 · 弹出 b:弹出栈顶 b。路径从 /a/b 回到 /a。只动栈顶,不会误删更早进入的 a。
读 c · 进入新目录:读到 c,普通目录,入栈。栈现在是 a、c 两层。
拼接结果:处理完了。把栈里的目录从底到顶用斜杠拼起来,前面补一个根斜杠,得到 "/a/c"。如果栈为空,就单独返回一个斜杠。
灵魂帧慢放 · 一句话看懂全过程:把整条路重放一遍:进入 a、进入 b,遇上级弹掉 b 回到 a,再进入 c。栈的高度就是路径的深度,栈顶就是当前所在目录。
记住这句话,上级目录为什么弹、普通目录为什么压、最后为什么拼,就都顺了:栈从底到顶正好是根目录往下走过的标准路径。
雷区实演 · 根目录遇上级:危险样例:路径一开头就是上级目录。栈为空,说明现在就在根目录;根的上一级还是根,这一步必须跳过,不能弹空栈。
雷区实演 · 继续读 x:继续读 x,普通目录入栈,最后结果是 "/x"。这两帧把「空栈遇上级目录」从文字坑变成了可见动作。
边界三连 · 看完更安心:三个边界一起过:根目录不能再往上退,三个点不是特殊符号,连续斜杠只产生要跳过的空段。
面试最常追这四个边界。答的时候都围绕一句话:栈顶就是当前路径的最后一层。
凡是「进入一层、退出一层、最近进入的先退出」的题,都在用同一个栈思想:简化路径练目录层级、括号匹配练符号层级、基本计算器练表达式层级。想系统刷可以让小欧带你打通 栈专题。
参考代码
class Solution: def simplifyPath(self, path: str) -> str: stack = [] for part in path.split("/"): if part == "" or part == ".": continue if part == "..": if stack: stack.pop() else: stack.append(part) return "/" + "/".join(stack)复杂度
- 时间复杂度:O(n),n 是路径长度。切分扫一遍;每个目录段最多入栈一次、出栈一次,总操作不超过 2n 量级,所以是线性。
- 空间复杂度:O(n),最坏没有任何上级目录,所有目录段都留在栈里,例如 /a/b/c/d,栈和输出都是 O(n)。
可套用的代码模板
遮住注释也要能默写这三档:① 忽略项跳过,② 回退项空栈不弹,③ 入栈项深入一层,最后把栈从底到顶拼回绝对路径。换成括号匹配、表达式求值,改的只是这三档各对应什么。
stack = []for part in parts: # parts 由斜杠切分得到 if part in ("", "."): # ① 忽略项:空段 / 原地 continue if part == "..": # ② 回退项:空栈不弹 if stack: stack.pop() else: # ③ 入栈项:深入一层 stack.append(part)return "/" + "/".join(stack) # 栈底到顶 = 绝对路径易错点
面试追问把动画讲成自己的话
追问为什么不用字符串替换?
追问三个点怎么办?
追问栈空时遇上级目录为什么不弹?
追问能不先切分吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。再去主线里挑下一道练手。
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题