替换空格:最直观的想法是,创建一个新的字符串变量result,然后从头开始遍历字符串s的每一个字符,如果当前字符不为空格,则将当前字符加入到result中,反之将"%20"加入到result中。

string replaceSpace(string s) {
        string result;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!=' ')
            result+=s[i];
            else
            result+="%20";
        }
        return result;
    }

idea:其实也可以将字符串变量result替换为vector<char>变量result,最后函数返回值使用构造函数和迭代器完成转换,即return string(result.begin(),result.end())。

string replaceSpace(string s) {
        vector<char> result;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!=' ')
            result.push_back(s[i]);
            else
            {
                result.push_back('%');
                result.push_back('2');
                result.push_back('0');
            }
        }
        return string(result.begin(),result.end());
    }

优化:上述方法均是使用了额外的空间,那么有没有不使用额外的空间的方法呢?当然有!我们不用创建新的变量,而是直接在原来的字符串s上进行修改。首先统计字符串s中的空格数量count,然后对字符串s进行扩容,接着再使用双指针方法从后向前遍历字符串,i表示原来字符串的元素位置,j表示扩容字符串的元素位置,当s[i]不为空时,就将s[i]赋值给s[j],反之从j位置开始依次倒序添加'0'、'2'、'%',直至i=j结束,故双指针的循环条件是i<j。

string replaceSpace(string s) {
        int count=0; //用于记录空格个数
        int olds=s.size(); //用于记录原始字符串长度
        for(int i=0;i<olds;i++) //统计s中空格个数
            if(s[i]==' ') count++;
        int news=olds+count*2; //扩容后的字符串长度
        s.resize(news); //对s进行扩容
        for(int i=olds-1,j=news-1;i<j;i--,j--) //双指针更新s
        {
            if(s[i]!=' ')
                s[j]=s[i];
            else
            {
                s[j]='0';
                s[j-1]='2';
                s[j-2]='%';
                j-=2; //注意更改j
            }
        }
        return s;
    }