Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
题意就是把一个复杂的文件路径,处理为最简路径。
思路:
1、要简化路径,主要是消除.和..的影响。对于.可以直接跳过;对于..,它相当于会抵消掉上一级路径。
2、由此,我想到了用栈的数据结构保存前面的各级路径,遇到.直接跳过,遇到..在栈不空的情况下,弹出栈顶。
3、由于路径以"/"进行分割,所以可以用split方法把path转化为数组,这样就便于处理了。
遇到的bug:
1、判断当前目录是否和.或者..相等时,自己用的==判断,应改为equals方法。
2、判断..时,自己的判断条件写的是paths[i].equals("..") && !stack.isEmpty(),应该把栈判断放在里面再进行判断。
3、最后生成了路径时,直接调用StringBuilder的append方法,应该用insert(0, xxx),这样路径的顺序才是正确的。
public String simplifyPath(String path) {
if (path == null || path.length() == 0) {
return "";
}
Stack<String> stack = new Stack<>();
String[] paths = path.split("/");
for (int i = 0; i < paths.length; i++) {
if (paths[i].equals("") || paths[i].equals(".")) {
continue;
} else if (paths[i].equals("..")) {
if (!stack.isEmpty()) {
stack.pop();
}
} else {
stack.push(paths[i]);
}
}
if (stack.isEmpty()) {
return "/";
}
StringBuilder res = new StringBuilder();
while (!stack.isEmpty()) {
res.insert(0, stack.pop());
res.insert(0, "/");
}
return res.toString();
}