题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
解题思路
利用C++中的STL和容器来求解。
代码实现
class Solution {
public:
string ReverseSentence(string str) {
if (str.empty())
return "";
vector<string> strvec;
string tempstr;
string::iterator iter = str.begin();
while(iter != str.end())
{
if(*iter != ' ')
tempstr.push_back(*iter++);
else
{
strvec.push_back(tempstr);
tempstr.clear();
iter++;
}
}
strvec.push_back(tempstr);
tempstr.clear();
reverse(strvec.begin(), strvec.end());
vector<string>::iterator itervec = strvec.begin();
for(; itervec != strvec.end(); itervec++)
{
tempstr += *itervec;
tempstr += " ";
}
iter = tempstr.end() - 1;
tempstr.erase(iter);
return tempstr;
}
};
下述代码在VS2013上完全没有问题,在OJ上不通过:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<string>
#include<list>
#include<algorithm>
#include<functional>
#include <iterator>
#include<numeric>
using namespace std;
string ReverseSentence(string str) {
if (str.empty())
return "";
string strtemp;
string::iterator striter = str.begin(), strtempiter;
list<string> strlist;
while (striter != str.end())
{
strtempiter = striter;
striter = find(striter, str.end(), ' ');
copy(strtempiter, striter, back_inserter(strtemp)); // strtemp没有扩容
strlist.push_front(strtemp);
strtemp.clear();
if (striter != str.end())
{
striter++;
}
}
strtemp.clear();
list<string>::iterator listiter = strlist.begin();
for (; listiter != strlist.end(); listiter++)
{
strtemp += *listiter;
strtemp += " ";
}
strtemp.erase(strtemp.end() - 1);
return strtemp;
}
void main()
{
string str1 = "am. I";
string str = ReverseSentence(str1);
cout << str << endl;
system("pause");
return;
}
-
当输入为:am. I
I am.
请按任意键继续. . . -
当输入为:technology.
technology.
请按任意键继续. . . -
当输入为:technology. of university Beijing like I
I like Beijing university of technology.
请按任意键继续. . . -
当输入为:空
请按任意键继续. . .
由此可见,这个代码是完全没有问题的 可是OJ过不了。。。。。。。。
补充一种新的思路
class Solution {
public:
string ReverseSentence(string str) {
if (str.empty())
return "";
string strtemp(str);
reverse(strtemp.begin(), strtemp.end());
string::iterator iter = strtemp.begin(), itertemp;
while(iter != strtemp.end())
{
itertemp = find(iter, strtemp.end(), ' ');
reverse(iter, itertemp);
iter = itertemp;
if(iter != strtemp.end())
iter++;
else
break;
}
return strtemp;
}
};