自己实现的方法一,思路是先获取空格的个数,然后根据空格个数申请新的字符串长度。

class Solution {
public:
    string replaceSpace(string s) {
        int size = s.size();
        int cnt = 0,loc = 0;
        for(int i = 0;i < size;i++)
            if(s[i] == ' ')
                cnt++;
        string res(size + 2*cnt,'0');
        for(int i = 0;i < size;i++)
        {
            if(s[i] != ' ')
            {
                res[loc++] = s[i];
            }else
            {
                res[loc++] = '%';
                res[loc++] = '2';
                res[loc++] = '0';
            }
                
        }

        return res;
    }
};

运行效率:

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:6.1 MB, 在所有 C++ 提交中击败了44.91%的用户

代码改进的几个思路:
一个空格变成%20,说明字符串最大变为原来的三倍,然后最后再去substr即可。
方法二:

class Solution {
public:
    string replaceSpace(string s) {
        int size = s.size();
        int loc = 0;
        string res(size * 3 ,'0');
        for(int i = 0;i < size;i++)
        {
            if(s[i] != ' ')
            {
                res[loc++] = s[i];
            }else
            {
                res[loc++] = '%';
                res[loc++] = '2';
                res[loc++] = '0';
            }
                
        }

        return res.substr(0,loc);
    }
};

运行效率:

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:6 MB, 在所有 C++ 提交中击败了82.38%的用户

代码上简洁了一点,但仔细想想string可以写的更简洁一点:
方法三:

class Solution {
public:
    string replaceSpace(string s) {
        string res;
        for(auto c:s)
        {
            //(c == ' ') ? res += "%20": res += c;
            if(c == ' ')
                res += "%20";
            else
                res += c;
        }
        
        return res;
    }
};