题目描述
下面的两种方法第一种较为笨拙,程序复杂但是容易想到。第二种方法实现简单,也方便。
参考:http://www.cnblogs.com/grandyang/p/4606676.html
方法一
方法一比较笨,对字符串处理,将每个单词存入到一个vector<string>
中,然后对这个vector反转,再将其连成一个字符串。
class Solution {
public:
void reverseWords(string &s) {
if(s.empty()) return;
vector<string> words;
auto p1=s.begin(), p2=s.begin(),p3=s.end();
while(p2!=p3)
{
while(' '== *p1 && p1!=p3)
{
++p1;
}
p2=p1;
while(' ' != *p2 && p2!=p3) ++p2;
if(p1!=p3) words.push_back(string(p1,p2));
p1=p2;
}
reverse(words.begin(),words.end());
s.clear();
for(int i=0;i<words.size();++i)
{
if(1==words.size()) s=words[i];
else if(i==words.size()-1) s+=words[i];
else s+=words[i]+' ';
}
}
};
方法二
使用字符串类stringstream
来解决问题。首先将字符串存入一个字符串流中,输入操作>>就会自行提取不含空格的单词。通过一个while循环,将提取到的单词加到结果字符串的前面就行了。如果原字符串s是由诸多空格组成的,那么第一个>>操作就会提取出这些空格放入s中,那么就需要将s清空。
class Solution {
public:
void reverseWords(string &s) {
istringstream is(s);
string temp;
is>>s;
while(is>>temp) s =temp +" " +s;
if(!s.empty() && s[0] == ' ') s = "";
}
};