菜雞每日一題系列打卡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)。
執行結果
學習 | 工作 | 分享
????長按關注“有理想的菜雞”
只有你想不到,沒有你學不到