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

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:简洁的思维,才是最强大的武器
相关推荐
夜思红尘5 小时前
算法--双指针
python·算法·剪枝
散峰而望5 小时前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
CoderCodingNo5 小时前
【GESP】C++五级真题(贪心思想考点) luogu-B4071 [GESP202412 五级] 武器强化
开发语言·c++·算法
我有一些感想……5 小时前
An abstract way to solve Luogu P1001
c++·算法·ai·洛谷·mlp
前端小L5 小时前
双指针专题(三):去重的艺术——「三数之和」
javascript·算法·双指针与滑动窗口
智者知已应修善业6 小时前
【求等差数列个数/无序获取最大最小次大次小】2024-3-8
c语言·c++·经验分享·笔记·算法
LYFlied7 小时前
【每日算法】LeetCode 416. 分割等和子集(动态规划)
数据结构·算法·leetcode·职场和发展·动态规划
多米Domi0117 小时前
0x3f 第19天 javase黑马81-87 ,三更1-23 hot100子串
python·算法·leetcode·散列表
历程里程碑7 小时前
滑动窗口最大值:单调队列高效解法
数据结构·算法·leetcode
課代表8 小时前
从初等数学到高等数学
算法·微积分·函数·极限·导数·积分·方程