【Daily Interview】- 10 简化路径

268 阅读2分钟

题目

图片1
图片1

!! 题目来源:简化路径 - 力扣

分析

这题乍一看有些复杂,但其实仔细把几个示例看过之后就会发现,实际上需要处理的情况并不多,无非是:

  • null
  • .
  • ..
  • path

而怎么处理它们呢?相比做过有效括号的问题之后,大家第一时间就能想到利用栈来帮助我们解决问题:

  • 遇到 null.,不做处理
  • 遇到 path,将 path 入栈
  • 遇到 ..,出栈

这样一来,代码就很容易实现了:

var simplifyPath = function (path) {
  const stack = [];
  const pathArr = path.split("/");
  for (let i = 0; i < pathArr.length; i++) {
    const p = pathArr[i];
    if (p === "..") {
      stack.pop();
    } else if (p === "." || p === "") {
      continue;
    } else {
      stack.push(p);
    }
  }
  return "/" + stack.join("/");
};

结果如下:

图片2
图片2

优化

上面的代码看着尚不算太丑,是因为总共需要处理的逻辑不多,假如这里我们还需要处理额外的逻辑,比如遇到 ~,认为是 /home/user,那么我们就只能新增额外的条件分支,以至后期代码逐渐变得庞大混乱,难以维护。

这里我们可以用策略模式进行优化:

var simplifyPath = function (path) {
  const stack = [];
  const pathArr = path.split("/");
  const strategy = {
    "": stack => stack,
    ".": stack => stack,
    "..": stack => stack.pop()
  };

  for (let i = 0; i < pathArr.length; i++) {
    const p = pathArr[i];
    if (p in strategy) {
      strategy[p](stack);
    } else {
      stack.push(p);
    }
  }
  return "/" + stack.join("/");
};

结果如下:

图片3
图片3