反转字符串

问题

输入一个字符串,一个单词一个单词地反转。例如:

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;
}