题目链接
思路:
首先,需要将所给路径字符串根据目录分隔符"/"进行分割,得到包含路径中各个目录的字符串数组。
准备一个栈,用于存储路径中有效的目录。
从头到尾开始遍历得到字符串数组
若当前字符串等于".",则说明原路径中存在的是"/./",这种路径并不起到任何指向路径的作用,需跳过;
若当前字符串等于"",则说明原路径中存在的是"//",这种路径并不起到任何指向路径的作用,需跳过;
若当前字符串等于"..",则说明原路径中存在的是"/../",这种路径说明需要返回到上一级目录,则若栈不为空,需将栈顶目录弹出;
若当前字符串不等于以上三种类型,则说明此时代表一个有效的目录,需要将此字符串压入栈中。
最后,栈中所有的目录都是组成有效路径的目录,但是从栈顶到栈底目录的顺序是逆序
本人是使用Deque作为栈,推荐用到栈时使用Deque,利用Deque的性质,可以从栈底(队尾)来取出数据。
public String simplifyPath(String path) {
if (path == null || path.length() == 0) {
return "";
}
// 将路径用分隔符"/"分隔成字符串数组
String[] strs = path.split("/");
// 准备一个栈,用于存储路径
Deque<String> stack = new ArrayDeque<>();
for (String str : strs) {
// 若当前字符串为"..",则说明需要返回上一层目录,此时需要将栈顶存储的目录弹出
if (str.equals("..")) {
if (!stack.isEmpty()) {
stack.pop();
}
// 此时什么都不做,因为不符合路径规范
} else if (str.equals(".") || str.equals("")) {
continue;
// 剩余的就是路径了,压入栈中
} else {
stack.push(str);
}
}
// 若栈中为空,则说明路径到了根目录,返回"/"
if (stack.isEmpty()) {
return "/";
}
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
// 每次从栈底弹出,并在前面加"/"
sb.append("/" + stack.pollLast()); // 利用Deque的特性
}
return sb.toString();
}