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

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:简洁的思维,才是最强大的武器
相关推荐
董董灿是个攻城狮9 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员16 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish17 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱18 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx2 天前
CART决策树基本原理
算法·机器学习
Wect2 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript