程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> (每日算法)Leetcode--Simplify Path (簡單路徑)

(每日算法)Leetcode--Simplify Path (簡單路徑)

編輯:C++入門知識

(每日算法)Leetcode--Simplify Path (簡單路徑)


給定一個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("") )







  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved