剑指Offer 05.替换空格

56 阅读1分钟

在这道题中,循环条件如果是i<=j,那么会当i==j==0时,j--造成溢出的错误。

思路

如果想把这道题目做到极致,就不要只用额外的辅助空间了!

首先扩充数组到每个空格替换成"%20"之后的大小。

然后从后向前替换空格,也就是双指针法,过程如下:

i指向新长度的末尾,j指向旧长度的末尾。

class Solution {
public:
    string replaceSpace(string s) {
        size_t spaces = 0;
        //统计空格的数量
        for(char c:s){
            if(c == ' '){
                spaces++;
            }
        }
        //扩充字符串长度
        auto oldStringLength = s.size();
        auto newStringLength = oldStringLength + 2*spaces;
        s.resize(newStringLength);
        //双指针法,i指向旧字符串末尾,j指向新字符串末尾
        //如果i=j
        for(auto i = oldStringLength - 1,j = newStringLength - 1;
        i <= j;){
            if(s[i]==' '){
                s[j--] = '0';
                s[j--] = '2';
                s[j--] = '%';
                i--;
            }else{
                s[j--] = s[i];
                i--;
            }
        }
    return s;
    }
};