题目
!! 题目来源:简化路径 - 力扣
分析
这题乍一看有些复杂,但其实仔细把几个示例看过之后就会发现,实际上需要处理的情况并不多,无非是:
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("/");
};
结果如下:
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!