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".
簡化路徑(Unix路徑表示),例如:
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
題解:
將path以"/"來切割文件夾名稱,並歷遍所有文件夾名稱,在歷遍過程中,利用stack紀錄路徑,有下面幾種情況:
- 遇到".",略過這個文件夾名稱
- 遇到"..",將stack排出一個文件夾名稱
- 遇到其他字符串則將該字符串加入stack當中
然後再將stack全部排出,用以組成簡化過的路徑名稱。
*注意coner case*
package LeetCode.Medium;
import java.util.Stack;
public class SimplifyPath {
public String simplifyPath(String path) {
if(path == null || path.length() == 0) {
return "/";
}
//將路徑以"/"的方式進行切割,切出每個文件夾的名稱
String[] names = path.split("/");
Stack<String> stack = new Stack<>();
//歷遍所有文件夾的名稱
for(int i = 0; i < names.length; i ++) {
//若遇到"."則可以略過(相同文件夾)
if(names[i].equals(".") == true || names[i].equals("")) {
continue;
}
//若遇到".."則可以推出一個文件夾(上一個文件夾)
if(names[i].equals("..") == true) {
//需要避免stack為空的情況
if(stack.isEmpty() == false) {
stack.pop();
}
//其他情況則可以添加文件夾
} else {
stack.push(names[i]);
}
}
//若stack為空,可以直接輸出結果
if(stack.isEmpty() == true) {
return "/";
}
//開始進行結果的拼接
String result = "";
int i = 0;
while(stack.isEmpty() == false) {
String folder_name = stack.pop();
//首個文件夾前面不加"/",到最後才添加,避免混亂
if(i == 0) {
result = folder_name;
} else {
result = folder_name + "/" +result;
}
i ++;
}
//在首個文件夾名稱前面添加"/"
result = "/" + result;
return result;
}
}
本文介绍了一种简化Unix风格绝对路径的方法,通过使用栈来处理路径中的符号'.'和'..',并考虑特殊情况,如路径开始的'..'和连续的'/'.
1581

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



