剑指 Offer 05. 替换空格

在部分编程语言中,我们可以动态地将原数组长度扩大,此时我们就可以使用双指针算法,来降低空间的使用:

  1. 首先遍历一遍原数组,求出最终答案的长度length;
  2. 将原数组resize成length大小;
  3. 使用两个指针,指针i指向原字符串的末尾,指针j指向length的位置;
  4. 两个指针分别从后往前遍历,如果str[i] == ' ',则指针j的位置上依次填充'0', '2', '%',这样倒着看就是"%20";如果str[i] != ' ',则指针j的位置上填充该字符即可。

由于i之前的字符串,在变换之后,长度一定不小于原字符串,所以遍历过程中一定有i <= j,这样可以保证str[j]不会覆盖还未遍历过的str[i],从而答案是正确的。

class Solution {
public:
    string replaceSpace(string s) {
        int len = 0;
        for(char &c : s)
            if(c == ' ') len += 3;
            else len++;
        
        int i = s.size(), j = len;
        s.resize(len);

        while(i >= 0)
        {
            if(s[i] == ' ')
            {
                s[j--] = '0';
                s[j--] = '2';
                s[j--] = '%';
            }
            else
                s[j--] = s[i];
            i--;
        }
        return s;
    }
};
posted @ 2021-07-18 16:49  Dazzling!  阅读(26)  评论(0编辑  收藏  举报