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

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:简洁的思维,才是最强大的武器
相关推荐
t1987512818 小时前
电力系统经典节点系统潮流计算MATLAB实现
人工智能·算法·matlab
断剑zou天涯18 小时前
【算法笔记】蓄水池算法
笔记·算法
长安er18 小时前
LeetCode 206/92/25 链表翻转问题-“盒子-标签-纸条模型”
java·数据结构·算法·leetcode·链表·链表翻转
唯道行18 小时前
计算机图形学·23 Weiler-Athenton多边形裁剪算法
算法·计算机视觉·几何学·计算机图形学·opengl
CoderYanger19 小时前
动态规划算法-01背包问题:50.分割等和子集
java·算法·leetcode·动态规划·1024程序员节
花月C19 小时前
个性化推荐:基于用户的协同过滤算法
开发语言·后端·算法·近邻算法
lxh011319 小时前
最长递增子序列
前端·数据结构·算法
Youyzq19 小时前
前端项目发布到cdn上css被编译失效问题rgba失效和rgb失效
前端·css·算法·cdn
风筝在晴天搁浅20 小时前
代码随想录 516.最长回文子序列
算法
菜鸟233号20 小时前
力扣513 找树左下角的值 java实现
java·数据结构·算法·leetcode