华为机试在线训练-牛客网(8)句子逆序

题目描述

将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符


接口说明

/**
 * 反转句子
 * 
 * @param sentence 原句子
 * @return 反转后的句子
 */
public String reverse(String sentence);

 

 

 


输入描述:

将一个英文语句以单词为单位逆序排放。



输出描述:

得到逆序的句子


输入例子:
I am a boy

输出例子:
boy a am I

这题我开始首先想到的竟然是先把句子拆成单词,然后再逆序并插入空格。。。
确实想复杂了,主要是联想到Qt中强大的QString::splite()函数:可以将字符串按指定分隔符拆分后存放到QList中。
然而STL的string 并没有,于是自己实现了一个按空格splite的函数:将字符串按空格拆分后丢到vector<string>中。
嗯,虽然这题解复杂了,但是自己实现的这个spliteBySpace()可以较容易的实现按其他分隔符拆分,比如,稍微改改可以实现按逗号拆分spliteByComma.
因此,记录下来便于刷其他题时方便。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

void spliteBySpace(vector<string> &vec_str,string str)
{
            string temp;
            auto it=str.begin();
            while(*it){
                auto iter=it;
                for(;iter!=str.end();iter++)
                {
                    if(isspace(*iter)){
                             it=iter+1;
                            break;
                    }
                    temp+=*iter;
                }
                vec_str.push_back(temp);
                temp.clear();
                if(iter==str.end())break;
            }
}

 int main()
{
            string inStr;
            getline(cin,inStr);
            vector<string > vec_str;
            spliteBySpace(vec_str,inStr);
            reverse(vec_str.begin(),vec_str.end());//反转
            for(auto it=vec_str.begin();it!=vec_str.end();it++){
                cout<<*it;
                if(it!=vec_str.end()-1)
                    cout<<" ";//中间位置插入空格,最后一个不能有空格
            }
            return 0;
}

这题其实主要是要快速解决两个问题:
1.按空格分隔;2.逆序

1.空格分隔其实std::cin默认就是。。如果要输入带空格的字符串必须使用std::getline,所以第一个问题就这么简单。。根本不需要自己实现分隔。。
控制台代码写少了就容易忽略这些基本细节。不过考虑到一般性的问题,如果题目要求按逗号逆序句子怎么破?所以自己实现splite函数还是有必要的。
2.逆序其实可以使用栈的特性,也可以直接调用reverse()更快
牛客网上看到如下解法,简洁到不行:
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
    stack<string> ss;
    string s;
    while(cin>>s)
    {
        ss.push(s);
    }
    while(!ss.empty())
    {
        cout<<ss.top();
        ss.pop();
        if(!ss.empty())
            cout<<' ';
    }
    cout<<endl;
}

这种代码就是拿来刷题的,如果不按两次文件终止符(EOF:win下是Ctrl+Z)无法停止循环,实际开发中这样写虽有问题,但是这种编程技巧确实值得借鉴。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ctrlturtle

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

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

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

打赏作者

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

抵扣说明:

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

余额充值