题目
!! 题目来源:简化路径 - 力扣
分析
这题乍一看有些复杂,但其实仔细把几个示例看过之后就会发现,实际上需要处理的情况并不多,无非是:
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("/");
};
结果如下:
优化
上面的代码看着尚不算太丑,是因为总共需要处理的逻辑不多,假如这里我们还需要处理额外的逻辑,比如遇到 ~,认为是 /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("/");
};
结果如下: