问题
输入一个字符串,一个单词一个单词地反转。例如:
Given s = "the sky is blue",
return "blue is sky the".
分析
实现原理很简单,首先将整个字符串反转,然后反转字符串.md依次反转每个单词即可
。
storeIndex表示当前存储到的位置
。遇到空格直接跳过,如果是非空格字符,此时看storeIndex是否为0,为0的话表示第一个单词,不用增加空格;如果不为0,说明不是第一个单词,需要在单词中间加一个空格。
代码如下
#include <iostream>
#include <algorithm>
#include <String>
using namespace std;
//无需split,跳过所有空格符,在每个单词后,手动添加一个空格符
void reverseWords(string &s)
{
int storeIndex = 0;
int n = s.size();
reverse(s.begin(), s.end());
for (int i = 0; i < n; i++)
{
if (s[i] != ' ')
{
int j = i; //j用于记录当前保存的位置
s[storeIndex++] = ' '; //手动添加空格符,index++
while(j < n && s[j] != ' ') //j移动,j出界循环终止
{
s[storeIndex++] = s[j++];
}
//j - i为单词的长度
reverse(s.begin() + storeIndex - (j - i), s.begin() + storeIndex);
//s[storeIndex++] = ' '; //手动添加空格符,index++
i = j; //更新已遍历过的位置
}
}
s.resize(storeIndex);
}
int main()
{
std::string str ("I like to code in C");
reverseWords(str);
cout << str << endl;
return 0;
}
有个地方需要注意:s[storeIndex++] = ' ';
添加空格符的位置。若反转单词后,再添加的话。在只有一个单词的情况下
,单词末尾会被手动添加一个空格符,这样的话就画蛇添足了。
C++小知识
string类的resize用法
int main()
{
std::string str ("I like to code in C++");
std::cout << str << '\n';
unsigned sz = str.size();
str.resize (sz+3,'+');
std::cout << str << '\n';
str.resize (8);
std::cout << str << '\n';
return 0;
}