复杂情况下string翻转

把一个句子以单词为最小单位的翻转
考察点在于:在原来句子中,可能存在任意插入的空格,预处理删除这些空格

代码

class Solution {
public:
    void reverseWords(string &s) {
        tackleSpace(s);
        reverse(s.begin(), s.end());  //整体翻转
        int index = 0;
        for (int i = 0;i < s.size();++i)
        {
            if (s[i] == ' ')
            {
                reverse(s.begin() + index, s.begin() + i);  //每个word翻转
                index = i + 1;
            }
        }
        reverse(s.begin() + index, s.end());  //最后一个word翻转
    }

    void tackleSpace(string& s) //处理空格
    {
        for (int i=0;i<s.size();++i)
        {
            while (s[i] ==' '&&(s[i+1]==' '||i==s.size()-1||i==0))
            {
                s.erase(i, 1);
            }
        }
    }
};

删除空格主要分为三种情况:
* 首部空格全部删掉
* 中间的连续空格,只保留一个
* 尾部的空格全部删掉

删除过程中,for和while结合使用的技巧:

for用来遍历整个string, index逐渐增大,但是在while中,string.size()会发生改变,而for的截止条件index < string.size()也会动态变化

理解string.size()

string s("abc");
    cout << s[3] << "here" << endl; //不越界 s[4]会越界
    for (int i = 0;i <= s.size();++i)
    {
        cout << s[i] << " address: " << (int)&s[i] << endl;
    }
    cout << '\0' << "here" << endl;  

ASCILL码
‘\0’: 0, 在gcc里面不输出,在VS编译器输出空格
’ ’ : 32

点赞