题目描述
牛客最近来了一个新员工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;
    }
};                










