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.头文件

for循环从尾遍历

在这里插入图片描述
思路:从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的利用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值