Given an absolute path for a file (Unix-style), simplify it.
For example,path =
"/home/"
, =>
"/home"
path = "/a/./b/../../c/"
, => "/c"
这道题一开始没想好,直接进行处理,结果写出的代码又臭又长,而且是用了提交大法,错了N多次才成功的。
以下为第一次AC时的代码:
public class Solution {
public String simplifyPath(String path) {
StringBuilder str = new StringBuilder();
for(int i = 0 ; i < path.length() ; ){
if(str.length() != 0 && str.charAt(str.length() -1) == '/' && path.charAt(i) == '/')
;
else if(path.charAt(i) == '/'){
int last = str.lastIndexOf("/");
if(last != -1 && str.length() - last -1 == 2 && str.charAt(last +1) == '.' && str.charAt(last + 2) == '.'){
if(last == 0)
str.delete(last +1, str.length());
else{
str.delete(last, str.length());
str.delete(str.lastIndexOf("/")+1, str.length());
}
}
else if(last != -1 && str.length() -last -1 == 1 && str.charAt(last +1) == '.'){
str.delete(last +1, str.length());
}
else
str.append(path.charAt(i));
}
else
str.append(path.charAt(i));
i ++;
}
int last = str.lastIndexOf("/");
if(last != -1 && str.length() - last -1 == 2 && str.charAt(last +1) == '.' && str.charAt(last + 2) == '.'){
if(last == 0)
str.delete(last +1, str.length());
else{
str.delete(last, str.length());
str.delete(str.lastIndexOf("/")+1, str.length());
}
}
else if(last != -1 && str.length() -last -1 == 1 && str.charAt(last +1) == '.'){
str.delete(last +1, str.length());
}
if(str.length() != 1 && str.charAt(str.length() -1) == '/')
str.delete(str.length()-1, str.length());
return str.toString();
}
}
反正是各种各样的规则,处理起来心累。
后来看别人的思路,其中一个做法让我豁然开朗:先将待处理的串用split函数分割,当然是以"/"分隔。
整理下思路:
两个"/"之间是"."则可以直接忽略,".."则返回上一级,其他的则直接加入路径。
要注意原串中两个或者多个"/"在一起的情况,这时split会产生""空串,还有如果在根目录,返回上一级也处理也有所不同。
下面是该思路的JAVA实现:
public class Solution {
public String simplifyPath(String path) {
StringBuilder res = new StringBuilder();
res.append("/");
String[] mid = path.split("/");
for(int i = 0 ; i < mid.length ; i ++ ){
if(mid[i].equals("") || mid[i].equals("."))
continue;
else if(mid[i].equals("..") )
if(res.lastIndexOf("/") == 0 )
res.delete(res.lastIndexOf("/") +1, res.length()) ;
else
res.delete(res.lastIndexOf("/"), res.length());
else{
if(res.length() == 1 && res.charAt(0) == '/' )
res.append(mid[i]);
else
res.append("/").append(mid[i]);
}
}
return res.toString();
}
}