LeetCode 71 簡化路徑
阿新 • • 發佈:2020-11-16
LeetCode71 簡化路徑
題目描述
以 Unix 風格給出一個檔案的絕對路徑,你需要簡化它。或者換句話說,將其轉換為規範路徑。
在 Unix 風格的檔案系統中,一個點(.)表示當前目錄本身;此外,兩個點 (..) 表示將目錄切換到上一級(指向父目錄);兩者都可以是複雜相對路徑的組成部分。更多資訊請參閱:Linux / Unix中的絕對路徑 vs 相對路徑
請注意,返回的規範路徑必須始終以斜槓 / 開頭,並且兩個目錄名之間必須只有一個斜槓 /。最後一個目錄名(如果存在)不能以 / 結尾。此外,規範路徑必須是表示絕對路徑的最短字串。
樣例
輸入:"/home/" 輸出:"/home" 解釋:注意,最後一個目錄名後面沒有斜槓。
輸入:"/../"
輸出:"/"
解釋:從根目錄向上一級是不可行的,因為根是你可以到達的最高階。
輸入:"/home//foo/"
輸出:"/home/foo"
解釋:在規範路徑中,多個連續斜槓需要用一個斜槓替換。
輸入:"/a/./b/../../c/"
輸出:"/c"
輸入:"/a/../../b/../c//.//"
輸出:"/c"
輸入:"/a//b////c/d//././/.."
輸出:"/a/b/c"
演算法分析
- 模擬題目
- 注意".."要返回上一級的目錄
時間複雜度
\(O(n)\)
Java程式碼
class Solution { public String simplifyPath(String path) { if(path.charAt(path.length() - 1) != '/') path += "/"; StringBuffer res = new StringBuffer(""); String name = ""; //儲存當前檔名 //從前到後掃描每個字元 for(int i = 0; i < path.length(); i ++){ char c = path.charAt(i); if(c != '/') name += c; //當前檔名還沒有讀取完畢 else{ //檔名讀取完畢 //case1 .. 表示返回上層 // /home/aa/.. ==> /home ==> 去掉"/aa" if(name.equals("..")){ //去掉aa while(res.length() != 0 && res.charAt(res.length() - 1) != '/'){ res.deleteCharAt(res.length() - 1); } //去掉 / if(res.length() != 0){ res.deleteCharAt(res.length() -1); } }else if(!name.equals(".") && !name.equals("")){ res.append("/").append(name); } name = ""; } } if(res.length() == 0) res.append("/"); return res.toString(); } }