小哆啦解题记:文件系统迷宫的逃脱计划

71. 简化路径 - 力扣(LeetCode)

话说那一天,小哆啦误闯进了一个诡异的世界 ------ Unix 文件系统。

那是一片由 / 铺就的迷宫,空气中弥漫着点(.)和两个点(..)的神秘气息。

他抬头一看,路径牌上赫然写着:

bash 复制代码
/usr/./bin/../lib///node/..///modules/

他揉揉眼,再看一次:

bash 复制代码
/usr/./bin/../lib///node/..///modules/

"这都是什么鬼!"小哆啦差点精神分裂,"我要是照这玩意儿走路,迟早绕回家门口。"


🎯 任务目标:化繁为简

Unix 路径简化规则有三条:

  1. . 表示"原地踏步",可以忽略
  2. .. 表示"后退一步",即返回上级目录
  3. 多个 /,就当一个 /

小哆啦盯着那串路径,脑子里只有一个念头:我要把这玩意儿整明白,整整齐齐地,像个程序员。


🧱 第一尝试:用栈来逃生!

他翻出平时用的冒险小道具 ------ 栈 stack,对路径逐个碎片检查。

c 复制代码
function simplifyPath(path: string): string {
  const stack: string[] = [];
  const parts = path.split('/');

  for (const part of parts) {
    if (part === '' || part === '.') continue;
    if (part === '..') stack.pop();
    else stack.push(part);
  }

  return '/' + stack.join('/');
}

他一边处理一边自言自语:

"你是 .?你原地跳舞去。"

"你是 ..?那我就回退一步!"

"你是个正常路径名?进栈!"

这个方法真不赖,清晰、好懂、效果立竿见影。小哆啦拍手大笑:"完美,老派冒险者果然靠得住。"


🧪 第二方案:尝试神秘的函数式魔法 ------ reduce

但就在他准备离开迷宫的那一刻,他看见了墙角一张泛黄的卷轴,写着古老而高深的咒语:

javascript 复制代码
Array.prototype.reduce()

"传说中可以将任何过程,化为状态演化的纯函数式炼金术......"

小哆啦眼前一亮,试试又何妨?

ini 复制代码
function simplifyPath(path: string): string {
  const parts = path.split('/');
  const simplified = parts.reduce<string[]>((acc, part) => {
    if (part === '' || part === '.') return acc;
    if (part === '..') acc.pop();
    else acc.push(part);
    return acc;
  }, []);
  return '/' + simplified.join('/');
}

只用一行 reduce,路径状态就像河流一样自然流淌,从原始混沌流向简洁秩序。

小哆啦感叹:"好家伙,我刚才还在用石锤敲怪兽,现在直接魔法化形了。"


🧠 栈 vs reduce 的究极对比:

对比项 栈写法 reduce 写法
思维模型 命令式(一步一步) 函数式(状态归纳)
代码量 稍多,易读 精简,表达集中
可扩展性 逻辑清晰,改动需控制语句结构 可组合性强,支持链式操作
适合人群 编程小白~中级者 喜欢函数式的优雅党
B格指数 ✨ ⭐⭐ ⭐⭐⭐⭐⭐("哇,reduce太酷了!")

💡 为啥 reduce 更像魔法?

因为你不再像栈那样手动推动流程,而是:

  • 先拆解:split('/')
  • 再过滤:忽略 ., '', 处理 ..
  • 再归约:路径一步步"演化",像生物体一样长成"最终状态"

这就是函数式编程最迷人的地方:你的代码,像一首逻辑诗。


🧘 小哆啦感悟

"路径简化,其实就像人生修行。"

  • . :原地打转,不动如山
  • ..:回头是岸,有时候后退也是前进
  • 多个 /:复杂不过是表象,背后其实很简单
  • reduce:简洁的思维,才是最强大的武器
相关推荐
熬了夜的程序员13 分钟前
【华为机试】122. 买卖股票的最佳时机 II
开发语言·算法·华为·面试·golang
qqxhb15 分钟前
零基础数据结构与算法——第五章:高级算法-动态规划经典-背包问题
算法·动态规划·完全背包·编辑距离·0-1背包
Tisfy1 小时前
LeetCode 3202.找出有效子序列的最大长度 II:取模性质(动态规划)
算法·leetcode·动态规划·题解·模运算
Tiny番茄2 小时前
LeetCode 121. 买卖股票的最佳时机
算法·leetcode·职场和发展
乔宕一2 小时前
定点小数与分数
算法
不知名。。。。。。。。2 小时前
分治算法---归并
算法
阿群今天学习了吗3 小时前
面向对象基础笔记
笔记·学习·算法
☞下凡☜4 小时前
C语言(20250717)
linux·c语言·算法
lemon_sjdk4 小时前
LWJGL教程(2)——游戏循环
java·人工智能·算法·游戏
盒子69104 小时前
leetcode丑数II计算第n个丑数
算法·leetcode·职场和发展