题目描述
描述:请实现一个函数,将一个字符串s中的每个空格替换成“%20”。例如,当字符串为We Are Happy,则经过替换之后的字符串为We%20Are%20Happy。
数据范围:0≤len(s)≤1000 。保证字符串中的字符为大写英文字母、小写英文字母和空格中的一种。
输入:"We Are Happy"
返回值:"We%20Are%20Happy"
输入:" "
返回值:"%20"
解题思路
替换空格:最直观的想法是,创建一个新的字符串变量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;
}