每日一題——簡化路徑

菜雞每日一題系列打卡71

每天一道算法題目 

小夥伴們一起留言打卡

堅持就是勝利,我們一起努力!

題目描述(引自LeetCode)

以Unix風格給出一個文件的絕對路徑,你需要簡化它。或者換句話說,將其轉換爲規範路徑。

在Unix風格的文件系統中,一個點(.)表示當前目錄本身;此外,兩個點(..)表示將目錄切換到上一級(指向父目錄);兩者都可以是複雜相對路徑的組成部分。更多信息請參閱:Linux / Unix中的絕對路徑vs相對路徑。

請注意,返回的規範路徑必須始終以斜槓/開頭,並且兩個目錄名之間必須只有一個斜槓/。最後一個目錄名(如果存在)不能以/結尾。此外,規範路徑必須是表示絕對路徑的最短字符串。

示例 1:
輸入:"/home/"
輸出:"/home"
解釋:注意,最後一個目錄名後面沒有斜槓。
示例 2:
輸入:"/../"
輸出:"/"
解釋:從根目錄向上一級是不可行的,因爲根是你可以到達的最高級。
示例 3:
輸入:"/home//foo/"
輸出:"/home/foo"
解釋:在規範路徑中,多個連續斜槓需要用一個斜槓替換。
示例 4:
輸入:"/a/./b/../../c/"
輸出:"/c"
示例 5:
輸入:"/a/../../b/../c//.//"
輸出:"/c"
示例 6:
輸入:"/a//b////c/d//././/.."
輸出:"/a/b/c"

題目分析

這是一道字符串的題目,有關字符串的題目,需要掌握常見的字符串處理方法,比如本文即將要用到的split方法。針對本題而言,該字符串代表的是一個相對路徑,通過特殊邏輯規則,將相對路徑轉化爲絕對路徑。

對規則進行簡要分析,對於".."的規則,可以藉助棧來模擬實現,而對於".","",可以直接跳過,對於其餘無特殊規則的字符串,則依次入棧,然後插入"/",順序拼接輸出即可。要注意絕對路徑爲"/"的特殊情況處理。

話不多說,上代碼!

代碼實現

class Solution {


    public String simplifyPath(String path) {
        // 以"/"分割字符串得到字符串數組
        String[] tmp = path.split("/");
        // 雙向鏈表,當作棧進行使用
        LinkedList<String> list = new LinkedList<>();
        for (String s : tmp) {
            // ".."的特殊規則
            if (!list.isEmpty() && s.equals("..")) list.removeLast();
            // 無特殊規則的字符串
            else if (!"".equals(s) && !".".equals(s) && !"..".equals(s))list.add(s);
        }
        // 特殊情況處理
        if (list.isEmpty()) return "/";
        // 進行字符串拼接
        StringBuilder builder = new StringBuilder();
        for (String s : list) builder.append("/").append(s);
        // 返回結果
        return builder.toString();
    }
    
}

代碼分析

對代碼進行分析,程序對輸入字符串進行了一次分割,並對得到的字符串數組進行了一次遍歷,然後對遍歷得到的鏈表進行拼接,總的時間複雜度爲O(n)。

而就空間而言,由於採用了字符串數組進行字符串分割結果保存,以及採用雙向鏈表進行字符串數組處理,因此,總的空間複雜度爲O(n)。

執行結果

學習 | 工作 | 分享

????長按關注“有理想的菜雞

只有你想不到,沒有你學不到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章