LeetCode #71 Simplify Path - 刷題之旅
1 題目描述
![]()
![]()
![]()
這個題目的目標是在把一個很複雜的路徑簡化成為一個簡單的路徑,例如:
- input:
/a/./b/../../c/ - output:
/c
從上面的例子來說,/a/b 進去後,往上一層,再往上一層,回到/,最後進到 /c,但直接寫成 /c 不就好了嗎?太蠢了,請簡化他!這就是題目的用意。
2 解法
從題目的思路來看,你會發現當遇到 /.. 的時候,就需要往上一層,其實就是把目前 stack 的最上面的目錄 pop 出來,當遇到正常的目錄而不是/. 或是 /.. 就可以放入 stack 裡面。從下面的圖片來看,以 /.../a/../b/c/../d/./ 為例子,我們可以看到 stack 的變化。(注意 /... 是一個目錄,因為他不是 /. 或是 /..)
從下圖來看,只要是正常檔案名稱,就放入 stack 裡面
當遇到
..的時候,就 pop 出來,當遇到.的時候,就不做任何事情,繼續往下走。
最後,把 stack 裡面的元素,用
/串接起來,就是答案。
1 | class Solution: |
但是我們發現應該可以簡化一下,因為 continue 的部分應該省略,專注在需要執行動作的條件if上。
1 | # continue 的部分應該省略,專注在需要執行動作的條件if上 |
以及最後的部分,我們可以用 join 實現,而不是用 while loop 來實現。
1 | # 可以用 join 實現 |
修改後的程式碼如下
1 | class Solution: |
時間複雜度O(n) for 循環遍歷整個 s 列表在 split 過後,時間複雜度為 O(n)。
空間複雜度O(n) 空間複雜度由字典 stack 存儲 n 個不同的檔案名稱,因此空間複雜度為 O(n)。
3 總結
總結來說,很開心這個題目也是30分鐘內就寫出解決辦法,但是對於程式碼的簡化,還是需要多加練習,這個題目的特性就是你發現要有需要回到上一層的需求,stack會是一個很好的選擇,因為 pop() 可以把上面的元素拿掉,這樣就可以達到目的。
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Shannon's Blog 🐟 技術 | 生活 | 旅行! 如果你覺得我的文章有幫助,希望你可以到我的 github 給我一個 star ⭐️ Shannon Blog Repo
評論