給定一個Unix風格的路徑,簡化之。使其不改變路徑的結果,但是去掉中間無用的字符。
因為系統執行的時候也是逐段查看的,因此最直觀的做法就是使用棧來簡化,當是/..時,出棧;當是/.時,忽視;當時其他時才進棧。
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
class Solution { public: string simplifyPath(string path) { vectorresult; for(auto i = path.begin(); i != path.end(); ) { ++i; auto j = find(i, path.end(), '/');//查找 string dir = string(i, j); //通過兩個迭代器構造字符串 if(!dir.empty() && dir != ".")//當是///時dir為空 { if(dir == ".."){ if(!result.empty()) result.pop_back(); } else result.push_back(dir); } i = j; } stringstream out; if(result.empty()) out<<"/"; else for(auto item : result) out<<"/"<
有三個知識點,寫出來,大家一起學習:
1)find函數的使用
算法並不直接操縱容器,而是遍歷兩個迭代器指定的一個元素范圍
find(vec.begin(), vec.end(), val)在[vec.begin(), vec.end())范圍內(左閉右開區間)查找元素val。
如果查找得到,然回該元素的迭代器;查找不到,返回第二個參數。2)通過迭代器構造string
string dir = string(i, j)
將dir初始化為迭代器i和j之間元素的拷貝(左閉右開區間)。
類通過=運算符的初始化和dir(string(i, j))相同。
3)stringstream的知識點
允許向string流中讀寫數據,out.str()--返回out所保存的string 拷貝;out.str(s)--將string s拷貝到out中,返回void
#include#include using namespace std; int main() { string line,word; while(getline(cin,line)) { stringstream stream(line); cout< >word){cout< 輸入:shanghai no1 school 19
輸出:shanghai no1 school 19
shanghai
no1
school
19
#include#include using namespace std; int main() { int val1 = 512,val2 =1024; stringstream ss; ss<<"val1: "< >dump>>a>>dump>>b; cout<
注意從stringstream中解析對象的時候,是以空格和回車鍵為分隔符的
輸出為:val1: 512
val2: 1024
512 1024
第一處黑體字部分:將int類型讀入ss,變為string類型
第二處黑體字部分:提取512,1024保存為int類型。當然,如果a,b聲明為string類型,那麼這兩個字面值常量相應保存為string類型
stringstream不會主動釋放內存(或許是為了提高效率),但如果你要在程序中用同一個流,反復讀寫大量的數據,將會造成大量的內存消 耗,因些這時候,需要適時地清除一下緩沖 (用 stream.str("") )