替换空格:最直观的想法是,创建一个新的字符串变量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; }