复杂情况下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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值