这道题目是Linux内核中比较常见的一个操作,就是对一个输入的文件路径进行简化。思路比较明确,就是维护一个栈,对于每一个块(以‘/’作为分界)进行分析,如果遇到‘../’则表示要上一层,那么就是进行出栈操作,如果遇到‘./’则是停留当前,直接跳过,其他文件路径则直接进栈即可。最后根据栈中的内容转换成路径即可(这里是把栈转成数组,然后依次添加)。时间上不会超过两次扫描(一次是进栈得到简化路径,一次是出栈获得最后结果),所以时间复杂度是O(n),空间上是栈的大小,也是O(n)。
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
Corner Cases:
- Did you consider the case where path =
"/../"
?
In this case, you should return"/"
. - Another corner case is the path might contain multiple slashes
'/'
together, such as"/home//foo/"
.
In this case, you should ignore redundant slashes and return"/home/foo"
.
public class Solution {
// 当输入为"/"时,输出也为"/"
public String simplifyPath(String path) {
String[] s = path.split("/");
ArrayList<String> al = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length; i++) {
if (s[i].equals("..")) {
if(al.size() > 0) {
al.remove(al.size() - 1);
}
}else if (!s[i].equals("") && !s[i].equals(".") ) {
al.add(s[i]);
}
}
sb.append('/');
for (String i: al) {
sb.append(i);
sb.append('/');
}
String res = sb.toString();
//这里要注意,如果res 的长度为1 的话,res.substring(0,0) 输出为空
if (res.length() > 1) {
res = res.substring(0, res.length() - 1);
}
return res;
}
}