翻转单词顺序列

问题描述:

AAA公司来了一位新同事,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

解题思路:分两步

第一步:将字符串整体翻转得到:I ma a tneduts

第二步:将每个单词翻转得到:I am a student

完整代码如下:

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

class solution
{
public:
    string ReverseSentence(string str)
    {
        int len = str.length();
        //非法输入判断
        if(len == 0)
            return str;
        //先将整个字符串翻转
        Reverse(str,0,len);
        //定义连个索引
        int beg = 0,end = 0;
        while(beg < len){
            //如果beg遇到空格就跳过
            if(str[beg] == ' '){
                beg++;
                end++;
            }
            //如果end遇到空格或者走到字符串的结尾,就说明beg和end之间肯定有单词
            else if(str[end] == ' ' || str[end] == '\0'){
                //将beg和end区间内的单词翻转
                Reverse(str,beg,end);
                beg = ++end;
            }
            else
                end++;
        }
            return str;
    }

    void Reverse(string str,int beg,int end)
    {
        int i = beg;
        for(;i < (beg+end)/2;++i)
            swap(str[i],str[beg+end-1-i);
    }
};

int main()
{
    solution s;
    string str = "student a am I",p;
    p = s.ReverseSentence(str);
    cout<<p<<endl;
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值