Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
題意就是把一個(gè)復(fù)雜的文件路徑,處理為最簡(jiǎn)路徑。
思路:
1、要簡(jiǎn)化路徑,主要是消除.和..的影響。對(duì)于.可以直接跳過(guò);對(duì)于..,它相當(dāng)于會(huì)抵消掉上一級(jí)路徑。
2、由此,我想到了用棧的數(shù)據(jù)結(jié)構(gòu)保存前面的各級(jí)路徑,遇到.直接跳過(guò),遇到..在棧不空的情況下,彈出棧頂。
3、由于路徑以"/"進(jìn)行分割,所以可以用split方法把path轉(zhuǎn)化為數(shù)組,這樣就便于處理了。
遇到的bug:
1、判斷當(dāng)前目錄是否和.或者..相等時(shí),自己用的==判斷,應(yīng)改為equals方法。
2、判斷..時(shí),自己的判斷條件寫的是paths[i].equals("..") && !stack.isEmpty(),應(yīng)該把棧判斷放在里面再進(jìn)行判斷。
3、最后生成了路徑時(shí),直接調(diào)用StringBuilder的append方法,應(yīng)該用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();
}