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".
维护一个栈,用以存储路径!
可以以字符 ' / ' 作为分隔符,把路径分开,分开以后的数组中可能会有以下几种情况:
1. 是 " . ",表示当前路径,是冗余的,直接忽略即可。
2. 是 “..” 表示上一级目录,这时候如果栈不空就POP ,表示抛弃当前目录,进入上一层目录。
3. 是 “” ,即空字符,这表明两个 ’ / ‘ 挨在了一起,也是冗余的,直接忽略。
4. 是除了以上之外的字符,这时候表示目录名称,把字符入栈。
最后重建路径,如果栈空,就输出根目录,如果不空,输出重建的路径。
public static String simplifyPath(String path)
{
int len=path.length();
int[] indexarr=new int[len];
int cnt=0;
for(int i=0;i<len;i++)
if(path.charAt(i)=='/')
indexarr[cnt++]=i;
String[] sarr;
if(indexarr[cnt-1]<len-1)
sarr=new String[cnt];
else {
sarr=new String[cnt-1];
}
for(int i=0;i<cnt-1;i++)
sarr[i]=path.substring(indexarr[i]+1, indexarr[i+1]);
if(indexarr[cnt-1]<len-1)
sarr[cnt-1]=path.substring(indexarr[cnt-1]+1);
Stack<String> stack=new Stack<>();
for(int i=0;i<sarr.length;i++)
{
if(sarr[i].compareTo("..")==0)
{
if(!stack.isEmpty())
stack.pop();
}
else if(sarr[i].compareTo(".")==0||sarr[i].compareTo("")==0);
else
{
stack.push(sarr[i]);
}
}
if(stack.isEmpty())
return "/";
StringBuilder sb=new StringBuilder();
sb.append('/');
for(String ss:stack)
{
sb.append(ss);
sb.append('/');
}
sb.deleteCharAt(sb.length()-1);
return sb.toString();
}
本文介绍了一个简化Unix风格绝对路径的方法,通过使用栈来处理路径字符串中的'.', '..'及多余的'/',并提供了详细的实现步骤。
1605

被折叠的 条评论
为什么被折叠?



