1. 程式人生 > 實用技巧 >LeetCode 71 簡化路徑

LeetCode 71 簡化路徑

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