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;
}
}