给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为 更加简洁的规范路径。
在 Unix 风格的文件系统中规则如下:
- 一个点
'.'表示当前目录本身。 - 此外,两个点
'..'表示将目录切换到上一级(指向父目录)。 - 任意多个连续的斜杠(即,
'//'或'///')都被视为单个斜杠'/'。 - 任何其他格式的点(例如,
'...'或'....')均被视为有效的文件/目录名称。
返回的 简化路径 必须遵循下述格式:
- 始终以斜杠
'/'开头。 - 两个目录名之间必须只有一个斜杠
'/'。 - 最后一个目录名(如果存在)不能 以
'/'结尾。 - 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含
'.'或'..')。
返回简化后得到的 规范路径 。
思路
比较典型的栈类型题目,因为..会返回上一级目录,意味着要把最后进去的一个元素pop掉
class Solution {
public String simplifyPath(String path) {
Deque<String> stack = new LinkedList<>();
// 先对字符串根据斜杠 /进行分割,得到一个字符串数组。这个字符串数组的字符串可能有以下几种:.、..、''、和表示目录的字母。
String[] split = path.split("/");
String res = "";
int i = 0;
while (i < split.length) {
//其实这一步多余了
String checkStr = split[i].replaceAll("/", "");
if ("".equals(checkStr)) {
i++;
continue;
}
switch (checkStr) {
case ".":
break;
case "..":
if(stack.size() > 0) stack.pop();
break;
default:
stack.push(checkStr);
}
i++;
}
while (stack.size() > 0){
String pop = stack.pop();
res = "/" + pop + res;
}
return "".equals(res) ? "/" : res;
}
}