這篇文章主要講解了“C++如何簡化路徑”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C++如何簡化路徑”吧!
10年積累的網(wǎng)站建設(shè)、成都網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有萍鄉(xiāng)免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
這道題讓簡化給定的路徑,光根據(jù)題目中給的那一個例子還真不太好總結(jié)出規(guī)律,應(yīng)該再加上兩個例子 path = "/a/./b/../c/", => "/a/c"和path = "/a/./b/c/", => "/a/b/c", 這樣我們就可以知道中間是"."的情況直接去掉,是".."時刪掉它上面挨著的一個路徑,而下面的邊界條件給的一些情況中可以得知,如果是空的話返回"/",如果有多個"/"只保留一個。那么我們可以把路徑看做是由一個或多個"/"分割開的眾多子字符串,把它們分別提取出來一一處理即可,代碼如下:
C++ 解法一:
class Solution { public: string simplifyPath(string path) { vectorv; int i = 0; while (i < path.size()) { while (path[i] == "/" && i < path.size()) ++i; if (i == path.size()) break; int start = i; while (path[i] != "/" && i < path.size()) ++i; int end = i - 1; string s = path.substr(start, end - start + 1); if (s == "..") { if (!v.empty()) v.pop_back(); } else if (s != ".") { v.push_back(s); } } if (v.empty()) return "/"; string res; for (int i = 0; i < v.size(); ++i) { res += "/" + v[i]; } return res; } };
還有一種解法是利用了C語言中的函數(shù)strtok來分隔字符串,但是需要把string和char*類型相互轉(zhuǎn)換,轉(zhuǎn)換方法請猛戳這里。除了這塊不同,其余的思想和上面那種解法相同,代碼如下:
C 解法一:
class Solution { public: string simplifyPath(string path) { vectorv; char *cstr = new char[path.length() + 1]; strcpy(cstr, path.c_str()); char *pch = strtok(cstr, "/"); while (pch != NULL) { string p = string(pch); if (p == "..") { if (!v.empty()) v.pop_back(); } else if (p != ".") { v.push_back(p); } pch = strtok(NULL, "/"); } if (v.empty()) return "/"; string res; for (int i = 0; i < v.size(); ++i) { res += "/" + v[i]; } return res; } };
C++中也有專門處理字符串的機(jī)制,我們可以使用stringstream來分隔字符串,然后對每一段分別處理,思路和上面的方法相似,參見代碼如下:
C++ 解法二:
class Solution { public: string simplifyPath(string path) { string res, t; stringstream ss(path); vectorv; while (getline(ss, t, "/")) { if (t == "" || t == ".") continue; if (t == ".." && !v.empty()) v.pop_back(); else if (t != "..") v.push_back(t); } for (string s : v) res += "/" + s; return res.empty() ? "/" : res; } };
Java 解法二:
public class Solution { public String simplifyPath(String path) { Stacks = new Stack<>(); String[] p = path.split("/"); for (String t : p) { if (!s.isEmpty() && t.equals("..")) { s.pop(); } else if (!t.equals(".") && !t.equals("") && !t.equals("..")) { s.push(t); } } List list = new ArrayList(s); return "/" + String.join("/", list); } }
感謝各位的閱讀,以上就是“C++如何簡化路徑”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C++如何簡化路徑這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!