【题目】
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"
.
【思路】
用过Linux的人都熟悉,路径简化的思路是:
遇到“/../"表示返回上级目录,需检查上级目录是否为空。
遇到"/./"则表示是本级目录,无需做任何特殊操作。
遇到"//"则表示是本级目录,无需做任何操
遇到其他字符则表示是文件夹名,无需简化。
字符串是空或者遇到”/../”,则需要返回一个"/"。
遇见"/a//b",则需要简化为"/a/b"。
需要栈来解决问题。
先将字符串依"/"分割出来,然后检查每个分割出来的字符串。
当字符串为空或者为".",不做任何操作。
当字符串不为"..",则将字符串入栈。
当字符串为"..", 则弹栈(返回上级目录)。
public class Solution {
public String simplifyPath(String path) {
Stack<String> zhan = new Stack<String>();
String[] parts = path.split("/");
for(String part : parts){
switch(part){
case ".":
case "" :
break;
case "..":
if(!zhan.isEmpty()){
zhan.pop();
}
break;
default:
zhan.push(part);
}
}
StringBuilder sb = new StringBuilder();
if(zhan.isEmpty()){
return "/";
}
while(!zhan.isEmpty()){
sb.insert(0, "/"+zhan.pop());
}
return sb.toString();
}
}
注意:例如:原始path是 /a/b/c/,栈里的顺序是:a b c,如果依次弹栈还原的话是:/c/b/a(错误!),正确答案为:/a/b/c,这里用
sb.insert(0, "/"+zhan.pop());
每次只插在开头,以保持顺序。