給定一個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) {
vector result;
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("") )