Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
Corner Cases:
这题需要用到一个stack,利用"/"来分割出每一个substring。"/"本身则不做处理直接跳过,再最后构造结果string的时候再按照规则加上/,这样就可以不用管连续有很多个/的情况。
- 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".
substring处理如下:
1.如果是".",什么都不做
2.如果是"..",从stack里pop出一个元素
3.如果是一般字符串,push进stack
最后把stack里的元素按照栈底到栈顶的顺序接在一起就行了。
public class Solution {
public String simplifyPath(String path) {
if(path == null || path.length() == 0)
return "";
LinkedList<String> stack = new LinkedList<String>();
char[] arr = path.toCharArray();
int i = 0;
while(i < arr.length){
if(arr[i] == '/'){
i++;
continue;
}
int start = i;
int end = start;
while(end < arr.length && arr[end] != '/')
end++;
i = end;
String sub = path.substring(start, end);
if(sub.equals(".")){
continue;
}
else if(sub.equals("..")){
if(!stack.isEmpty())
stack.remove(stack.size() - 1);
}
else{
stack.add(sub);
}
}
StringBuffer str = new StringBuffer("/");
if(stack.isEmpty())
return str.toString();
while(!stack.isEmpty()){
str.append(stack.pollFirst()).append("/");
}
str.deleteCharAt(str.length() - 1);
return str.toString();
}
}

本文深入探讨了如何将Unix风格的绝对路径进行简化的过程,通过使用栈数据结构,遵循特定规则处理路径中的符号,最终实现路径的简洁化。包括对常见特例的处理,如连续的斜杠和特殊符号'..'、'.'的含义与作用。

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



