简化路径
描述
-
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为 更加简洁的规范路径
-
在 Unix 风格的文件系统中规则如下
- 一个点 ‘.’ 表示当前目录本身
- 此外,两个点 ‘…’ 表示将目录切换到上一级(指向父目录)
- 任意多个连续的斜杠(即,‘//’ 或 ‘///’)都被视为单个斜杠 ‘/’
- 任何其他格式的点(例如,‘…’ 或 ‘…’)均被视为有效的文件/目录名称
- 返回的 简化路径 必须遵循下述格式:
- 始终以斜杠 ‘/’ 开头
- 两个目录名之间必须只有一个斜杠 ‘/’
- 最后一个目录名(如果存在)不能 以 ‘/’ 结尾
- 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…’)
-
返回简化后得到的 规范路径
示例 1
输入:path = "/home/"
输出:"/home"
解释:应删除尾随斜杠
示例 2
输入:path = "/home//foo/"
输出:"/home/foo"
解释:多个连续的斜杠被单个斜杠替换。
示例 3
输入:path = "/home/user/Documents/../Pictures"
输出:"/home/user/Pictures"
解释:两个点 “…” 表示上一级目录(父目录)。
示例 4
输入:path = "/../"
输出:"/"
解释:不可能从根目录上升一级目录。
示例 5
输入:path = "/.../a/../b/c/../d/./"
输出:"/.../b/d"
解释:“…” 在这个问题中是一个合法的目录名。
提示
- 1 <= path.length <= 3000
- path 由英文字母,数字,‘.’,‘/’ 或 ‘_’ 组成
- path 是一个有效的 Unix 风格绝对路径
Typescript 版算法实现
1 ) 方案1:模拟栈
function simplifyPath(path: string): string {
const stk = [];
for (const s of path.split('/')) {
if (!s || s === '.') {
continue;
}
if (s !== '..') {
stk.push(s);
} else if (stk.length > 0) {
stk.pop();
}
}
return '/' + stk.join('/');
};
2 ) 方案2:栈
function simplifyPath(path: string): string {
const names = path.split("/");
const stack = [];
for (const name of names) {
if (name === "..") {
stack.length && stack.pop()
} else if (name.length && name !== ".") {
stack.push(name);
}
}
return "/" + stack.join("/");
};