本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
- 始终以斜杠
'/'开头。 - 两个目录名之间必须只有一个斜杠
'/'。 - 最后一个目录名(如果存在)不能 以
'/'结尾。 - 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含
'.'或'..')。
返回简化后得到的 规范路径 。
输入: path = "/../"
输出: "/"
解释: 从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。
题目解析
思路一
/**
* @param {string} path
* @return {string}
*/
var simplifyPath = function(path) {
// 将路径以"/"切分,切分后存在的几种情况 "." "字母" ".." ""多个/就会出现最后一种情况
let resPath = path.split('/');
let stack = []
for (let curPath of resPath) {
if (curPath === '' || curPath === '.') {
// 当出现''或者.的时候什么都不做
continue;
} else if (curPath === '..') {
// 当出现..向上翻一层,即出栈
stack.length && stack.pop();
} else {
// 用/切分后总共就三种情况所以剩下的就是字母了直接入栈
stack.push(curPath);
}
}
return '/' + stack.join('/');
};
思路二
我们这里可以使用栈的思想在遇到斜杠 / 检查操作符判断是否把元素出栈,否则元素累加进栈, 这种方法需要注意一点就是路径必须以 / 结尾,否则会出现最后的元素无法解析的问题
/**
* @param {string} path
* @return {string}
*/
var simplifyPath = function(path) {
path = path + '/'
const stack = []
let temp = ''
for (let s of path) {
if (s === '/') {
if (temp === '..') {
stack.pop()
} else if (temp && temp !== '.') {
stack.push(temp)
}
temp = ''
} else {
temp += s
}
}
return '/' + stack.join('/')
};