问题描述:
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
- 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"
.
基本思想:
此题可以用一个堆栈存储每层文件夹或文件,如果两个/之间的内容是".."就弹出栈顶元素,如果遇到“.”或“”就不变。基本思想就是这样。但要考虑一些corner case,如“/../”,"///"等
代码:
public String simplifyPath(String path) { //Java
// return "/";
path = path.trim();
if(path.equals("/"))
return "/";
List<String> stack = new LinkedList<String>();
int top = -1;
String tmp = path;
while(!tmp.equals("")){
if(tmp.startsWith("/"))
tmp = tmp.substring(1);
if(tmp.equals(""))
break;
if(tmp.contains("/")){
int pos = tmp.indexOf("/");
String file = tmp.substring(0,pos);
tmp = tmp.substring(pos);
if(file.equals(".")|| file.equals(""))
continue;
if(file.equals("..")){
if(top>-1)
top--;
continue;
}
stack.add(++top,file);
}
else {
String file = tmp;
tmp = "";
if(file.equals("."))
continue;
if(file.equals("..")){
if(top>-1)
top--;
continue;
}
stack.add(++top,file);
}
}
//generate path;
String rpath = "/";
for(int i = 0; i <=top ; i++)
rpath += stack.get(i)+"/";
if(top >=0)
rpath = rpath.substring(0,rpath.length()-1);
return rpath;
}