力扣151. 翻转字符串里的单词||力扣:剑指 Offer 58 - I. 翻转单词顺序(单词截取问题)

力扣:剑指 Offer 58 - I. 翻转单词顺序
力扣151. 翻转字符串里的单词
题目描述:

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。

示例1️⃣:

输入: "the sky is blue"
输出: "blue is sky the"

示例2️⃣:

输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例3️⃣:

输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

分析:
从字符串中截取单词,放置于临时容器中,依次取出并加上单一空格。

代码题解一:

class Solution {
public:
    string reverseWords(string s) {
    if(s.empty())return "";
    s+=" ";
    string tmp="";
    vector<string>res;
    for(char i:s){
        if(i==' '){             //不可写成:
            if(!tmp.empty()){  //if(i==' '&&!tmp.empty())
            res.push_back(tmp);//它的否定else 为
            tmp.clear();     //i!=' '||tmp.empty()
            }                //当tmp为空时,有可能加上前置或后置空格
        }
        else tmp+=i;
    }
    s.clear();            //清空s,使用原有的空间
    for(int i=res.size()-1;i>=0;i--){
        s+=res[i];         //从后往前,将res中储存的单词倒序输入s
        if(i!=0)s+=" ";//单词间用单空格隔开
    }
    return s;
    }
};

代码题解二:使用双指针截取

class Solution {
public:
    string reverseWords(string s) {
    if(s.empty())return "";
    s+=" ";           //关键,确保能取到最后一个单词
    vector<string>res;
    for(int i=0;i<s.size();i++){
        if(s[i]!=' '){
        int j=i;
        while(s[j]!=' ')j++;
        string tmp=s.substr(i,j-i);
        res.push_back(tmp);
        i=j;
        }
    }
    s.clear();            //清空s,使用原有的空间
    for(int i=res.size()-1;i>=0;i--){
        s+=res[i];
        if(i!=0)s+=" ";
    }
    return s;
    }
};

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0<Solving)1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值