您的位置:首页 > 其它

71. Simplify Path

2016-06-04 23:13 274 查看
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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: