题目描述
思路解析动画文字版
记住这一句,下面每一帧都在套它。空段在图里用 · 标出来。
上排是分好的段(固定不变),下面竖着的是目录栈。指针停在第一段。
第 0 段是空段(连续的 / 切出来的) → 不影响层级,跳过。
第 1 段是目录名「home」→ 进入这一级,入栈。
第 2 段是 "."(当前目录) → 不影响层级,跳过。
第 3 段是目录名「user」→ 进入这一级,入栈。
第 4 段是 ".." → 回到上一级,把栈顶弹出来。
第 5 段是目录名「docs」→ 进入这一级,入栈。
第 6 段是目录名「a」→ 进入这一级,入栈。
第 7 段是目录名「b」→ 进入这一级,入栈。
第 8 段是 ".." → 回到上一级,把栈顶弹出来。
第 9 段是目录名「c」→ 进入这一级,入栈。
第 10 段是 "."(当前目录) → 不影响层级,跳过。
第 11 段是目录名「d」→ 进入这一级,入栈。
第 12 段是 ".." → 回到上一级,把栈顶弹出来。
第 13 段是 ".." → 回到上一级,把栈顶弹出来。
第 14 段是目录名「e」→ 进入这一级,入栈。
第 15 段是目录名「f」→ 进入这一级,入栈。
第 16 段是目录名「g」→ 进入这一级,入栈。
第 17 段是 "."(当前目录) → 不影响层级,跳过。
第 18 段是 ".." → 回到上一级,把栈顶弹出来。
第 19 段是目录名「h」→ 进入这一级,入栈。
第 20 段是空段(连续的 / 切出来的) → 不影响层级,跳过。
第 21 段是目录名「i」→ 进入这一级,入栈。
第 22 段是 ".." → 回到上一级,把栈顶弹出来。
第 23 段是目录名「final」→ 进入这一级,入栈。
所有段处理完,把栈里的目录从底到顶用 / 串起来,就是简化路径 /home/docs/a/e/f/h/final。
关键看 ".." 碰到空栈时的处理。
同一套规则,盯着连续两个 ".." 那两帧。
空段 → 跳过。
「a」是目录名,入栈。
"." → 跳过。
「b」是目录名,入栈。
".." → 弹出栈顶,回上一级。
".." → 弹出栈顶,回上一级。
「c」是目录名,入栈。
连续两个 ".." 把 a、b 都弹掉又遇空栈忽略,最后只剩 c → 答案 /c。
边界先想清。
两个高频追问。
参考代码
def simplifyPath(path: str) -> str: stack = [] for seg in path.split("/"): if seg == "" or seg == ".": continue if seg == "..": if stack: stack.pop() else: stack.append(seg) return "/" + "/".join(stack)复杂度
- 时间:O(n),每段处理一次,进出栈各至多一次
- 空间:O(n),最坏全是目录名,都压进栈
易错点
面试追问把动画讲成自己的话
追问为什么用栈而不是直接字符串拼接?
追问结果末尾要不要带 /?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。再去主线里挑下一道练手。
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题