欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode面试题58 - I. 翻转单词顺序

程序员文章站 2022-04-30 18:21:53
...

题目来源

leetcode面试题58 - I. 翻转单词顺序

解题方法

istreamstring秒解

istreamstring详解
附上代码

class Solution {
public:
    string reverseWords(string s) {
        string res;
        stack<string> stack;
        string str;
        istringstream ss(s);
        while(ss >> str){
            stack.push(str);
            stack.push(" ");
        }
        if(stack.size()!=0)
            stack.pop();
        while(stack.size()!=0){
            res+=stack.top();
            stack.pop();
        }
        return res;
    }
};

注意点
1.头文件leetcode面试题58 - I. 翻转单词顺序

for循环从尾遍历

leetcode面试题58 - I. 翻转单词顺序
思路:从s的最后一个非空格字符开始,记录len,如果遇到空格字符,则说明单词结束,存入res中,并置零len
易错点:若s[0]不是空格,在循环结束时可能导致单词遗漏,因此用if判断是不是还有漏的单词,再存入,最后处理掉res最后一个空格即为答案
附上代码

class Solution {
public:
    string reverseWords(string s) {
        string res;
        string str;
        int len=0;
        for(int i=s.size()-1;i>=0;i--){
            if(s[i]==' ' && len!=0){
                res+=s.substr(i+1, len) + " ";
                len=0;
            }
            if(s[i]!=' ')
                len++;
        }
        if(len!=0)
            res+=s.substr(0,len)+" ";
        if(res.size()!=0)
            res.erase(res.size()-1,1);
        return res;
    }
};

自己写split函数

思路:先去除头尾多余空格,调用split函数,最后写入res即可
附上代码

class Solution {
public:
    string reverseWords(string s)
    {
        s=trimAll(s);
        if (s.length() == 0) return "";
        vector<string> word = split(s, ' ');
        string str = "";
        for (int i = word.size() - 1; i > 0; i--)
        {
            str += word[i];
            str.push_back(' ');
        }
        str += word[0];
        return str;
    }
    vector<string> split(string str, char ch)
    {
        vector<string> res;
        string tmp="";
        for(int i=0;i<str.size();i++){
            if(str[i] !=ch)
                tmp+=str[i];
            else{
                if(tmp.size()!=0){
                    cout << tmp << endl;
                    res.push_back(tmp);
                    tmp="";
                }
            }
        }
        cout<< tmp<<endl;
        if(tmp.size()!=0)
            res.push_back(tmp);
        return res;
    }
    string trimAll(string str){
        if(str.size()!=0){
            str.erase(0,str.find_first_not_of(" "));
            str.erase(str.find_last_not_of(" ")+1);
        }
        return str;
    }
};

收获

istringstream的利用