以 Unix 風格給出一個文件的絕對路徑,你須要簡化它。或者換句話說,將其轉換爲規範路徑。在 Unix 風格的文件系統中,一個點(.)表示當前目錄自己;此外,兩個點 (..) 表示將目錄切換到上一級(指向父目錄);二者均可以是複雜相對路徑的組成部分。更多信息請參閱:Linux / Unix中的絕對路徑 vs 相對路徑code
請注意,返回的規範路徑必須始終以斜槓 / 開頭,而且兩個目錄名之間必須只有一個斜槓 /。最後一個目錄名(若是存在)不能以 / 結尾。此外,規範路徑必須是表示絕對路徑的最短字符串。隊列
可能有點複雜,我採用了兩個雙端隊列,第一個負責對路徑進行處理,去掉路徑中的"/",將處理好的字符串存儲在第一個隊列中,每個目錄對應一個字符串,而後對一個字符串進行訪問,當不是".." 或"."時,將這個路徑彈出,放入第二個隊列中,當是".." 且第二個隊列不爲空時,彈出第二個隊列的隊尾元素;當爲其餘狀況時,進行下一次循環。最後第二個隊列就爲簡化後的路徑,將其分別彈出而後加上"/"就行。leetcode
class Solution { public: string simplifyPath(string path) { deque<string> que1; deque<string> que2; for(int i = 0; i < path.size(); i++){ string temp; while(path[i] == '/' && i < path.size()) { i++; } while(path[i] != '/' && i < path.size()) { temp += path[i]; i++; } if(!temp.empty()) {que1.push_back(temp);}; } while(!que1.empty()){ string temp = que1.front(); que1.pop_front(); if(temp != "." && temp != "..") { que2.push_back(temp); } else if(temp == "." ) { continue; } else if(temp == ".." && !que2.empty()){ que2.pop_back(); } else { continue; } } cout << "-------" << endl; string res = "/"; while(!que2.empty()) { res += que2.front(); que2.pop_front(); res += "/"; } if(res.size() != 1) { res.erase(res.end() - 1); } return res; } };