剑指offer58_反转单词顺序1

剑指offer58_反转单词顺序1

我觉得这个题利用string的rfind()以及append()、erase()结合来使用比较方便且利于理解,当然这可能并不是最优解,

输入:I have a phone
输出:phone a have I

这个题最开始做以为很简单,但后来我发现是我想多了,他需要适应的场景有很多,力扣上是这样描述的
在这里插入图片描述

所以要做到消除掉字符串头、尾的空格,以及对于字符串中两单词间对于的空格也要给予删除,保留一个即可。

代码如下:

#include <iostream>
#include <string>
using namespace std;

string reversewords(string s) {
    string res;
    int ret = 0, r = s.size();

	//当字符串头存在空格给予清除
    while (s[0] == ' ')
    {
        s.erase(0, 1);
    }
    //增加判断,排除空串情况
    if (s.size() >= 1)
    {
    	//当字符串尾部存在字符串给予清除
        while (s[s.size() - 1] == ' ')
        {
            s.erase(s.size() - 1, 1);
        }
    }
	
	//如果为空串或者size为1
    if (s.size() == 0 || s.size() == 1)
    {
        return s;
    }
    int flag = 0, l = 0;
    while (ret != -1)
    {
        l++;	//利用l记录是否查找到字符串内空格,l == 1,不存在空格,即字符串无需反转
        flag = ret;
        ret = s.rfind(' ', r);	//从右端开始查找
        if (flag - ret == 1)	//判断是否多个空格连在一起的情况
        {
            r--;
            continue;
        }
        res.append(s, ret + 1, r - ret);
        res += ' ';
        r = ret - 1;
    }
    if (l == 1)	//不存在空格,即字符串无需反转
    {
        return s;
    }
    else {
        res.erase(res.size() - 1, 1);	//将最后一个添加的空格去除
    }
	return res;
}

int main()
{
	string s = "the sky is bule";
	string ret = reversewords(s);
	
    for (int i = 0; i < ret.size(); i++)
    {
        cout << ret[i];
    }
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值