简化路径
给定一个文档 (Unix-style) 的完全路径,请进行路径简化。
例如,
path = “/home/” => “/home”
path = “/a/./b/…/…/c/” => “/c”
path = “/a/./b/…/c/” => “/a/c”
边界情况:
- 你是否考虑了 路径 = “/…/” 的情况?
在这种情况下,你需返回 “/” 。 - 此外,路径中也可能包含多个斜杠 ‘/’ ,如 “/home//foo/” 。
在这种情况下,你可忽略多余的斜杠,返回 “/home/foo” 。
思路+代码+注释:
public class SevenOne {
public static void main(String[] args) {
System.out.print(simplifyPath("//"));
}
public static String simplifyPath(String path) {
/*
思路:
添加一个例子: path = "/a/./b/../c/" => "/a/c"
根据三个例子和边界情况可以总结出规律:
使用集合记录需要记录的字符串,整个路径可以看成是用/分隔开的字符串数组,分割后的字符串数组如果字符串是.那么不记录;
如果是..那么该..不记录并且移除集合中记录的最后一个字符串;最后将集合中的字符串都拼接起来
*/
String[] pathStrs=path.split("/");
//说明字符串只有/或者//
if (pathStrs.length==0)
{
return "/";
}
//使用集合记录可以保留的字符串
List<String> resList=new ArrayList<>();
for (int i = 0; i < pathStrs.length; i++) {
//字符串不是.
if (!pathStrs[i].equals("."))
{
//字符串不是""
if (!pathStrs[i].equals(""))
{
if (pathStrs[i].equals(".."))
{
if (resList.size()>0)
{
resList.remove(resList.size()-1);
}
}else {
resList.add("/"+pathStrs[i]);
}
}
}
}
//记录集合中没有字符串,说明路径中没有字母,返回/
if (resList.size()==0)
{
return "/";
}
StringBuilder res=new StringBuilder();
for (String str:resList
) {
res.append(str);
}
return res.toString();
}
}