题目:
Given an input string, reverse the string word by word.(给定一个输入字符串,按单词翻转这个字符串)
For example,
Given s = "the sky is blue
",
return "blue is sky the
".
Clarification:
- What constitutes a word?
A sequence of non-space characters constitutes a word.(没有空格的连续字符组成了一个单词) - Could the input string contain leading or trailing spaces?(字符串的开头和结尾是否可以为空格)
Yes. However, your reversed string should not contain leading or trailing spaces.(可以,但是翻转后的字符串开头和结尾不能有空格) - How about multiple spaces between two words?(如果两个单词直接有多个空格怎么办)
Reduce them to a single space in the reversed string.(翻转后的字符串空格减少到只有一个)
把单词存入一个容器中,然后再reverse一下,然后按顺序赋给s即可。(注意当s为空或者s全是空格时,转换后的s为空)
代码:
class Solution {
public:
//要考虑到空字符串以及只有空格组成的字符串(注意空和空格字符的区别)
void reverseWords(string &s)
{
vector<string> svec;//存储s的每个单词,不包含空格
//s为空直接返回
if(s.empty())
return;
for(size_t i = 0 ; i < s.size() ; i++)
{
//如果当前字符为空格
if(s[i] == ' ')
continue;
string word;//临时保存当前的单词,在这里定义的好处是下次循环时word初始值又为空了
//开始写成了while(s[i] != ' ' && i < s.size()),一直出现访问越界问题
//因为当i == s.size()时,先访问了s[i]而不是先判断i<s.size(),导致访问越界,这种问题以前还没碰到过,还是写的代码太少了啊
while(i < s.size() && s[i] != ' ')
{
word += s[i];
i++;
}
svec.push_back(word);//把当前单词放入容器
}
reverse(svec.begin(),svec.end());//把单词翻转一下,也可以不翻转,而是按逆序把单词放入s中
//如果svec为空,说明s全为空格,则直接令s为空即可
if(svec.empty())
s = "";
else
{
s.clear();//先清空s
size_t i = 0;
//因为题目要求最后一个字符不能是空格,因此先遍历到倒数第二个单词
for(i = 0 ; i < svec.size()-1 ; i++)
{
s += svec[i];//把当前单词加到s后面
s += ' ';//在s后面再补一个空格
}
s += svec[i];//最后把最后一个单词补上,这样最后一个字符就不是空格了
}
}
};