題目描述:給定一個 Unix 風格的絕對路徑字串 path,將其化簡為最簡形式。需要處理以下情況:多個連續斜線(//)視為一個斜線;. 表示當前目錄,可直接忽略;.. 表示上一層目錄,需返回上一層;合法的目錄名稱則保留。最終結果不能以斜線結尾(根目錄 / 除外)。
解題思路:使用 stack 模擬目錄層級的進出。先以 / 為分隔符號將路徑切割成各個 token。對每個 token 進行判斷:若為空字串或 .,直接跳過(對應多餘斜線或當前目錄);若為 ..,則彈出堆疊頂部(返回上一層),但需注意堆疊為空時不做任何操作;若為合法目錄名稱,則將其壓入堆疊。最後從堆疊底部到頂部依序組合,以 / 連接,並在最前面加上 / 形成最終路徑。
時間複雜度:O(n) — 以 stringstream 分割字串需要 O(n),對每個 token 的堆疊操作均為 O(1),最後組合結果也是 O(n),整體為線性時間(n 為路徑字串長度)。
空間複雜度:O(n) — 堆疊最多存放 O(n/2) 個目錄名稱(最壞情況下每個目錄名稱只有一個字元,以斜線分隔),額外空間與輸入長度成正比。
1. Initialize an empty stack. 2. Split path by '/' to get tokens. 3. For each token: a. If token is empty or ".": skip. b. If token is "..": pop from stack if stack is not empty. c. Otherwise: push token onto stack. 4. Collect stack contents into a list (bottom to top). 5. Reverse the list. 6. Join with '/' and prepend '/'. 7. Return result.
方法一:使用 deque 取代 stack
deque 可以從兩端存取,省去最後 reverse 的步驟——直接從 deque 前端(底部)開始組合結果。與 stack 解法複雜度相同(時間 O(n),空間 O(n)),但程式碼更簡潔。面試中展示對 deque 特性的掌握是額外加分點。
方法二:手動解析字串(Manual Parsing)
不借助 stringstream,而是手動用雙指標在原始字串上定位每個 / 之間的子字串。可以避免建立額外的字串物件,但程式碼較繁瑣。時間複雜度 O(n),空間複雜度 O(n)。在記憶體敏感的環境下略有優勢。
\ 作為分隔符,以及 C: 這類磁碟機前綴)?/ 開頭),並給定當前工作目錄,如何擴展現有解法以正確計算最終絕對路徑?