题目描述
将一个英文语句以单词为单位逆序排放。例如“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)无法停止循环,实际开发中这样写虽有问题,但是这种编程技巧确实值得借鉴。