请实现一个函数,把字符串中的每个空格替换成
"%20"。数据范围
0≤ 输入字符串的长度 ≤1000。
注意输出字符串的长度可能大于 1000。样例
输入:"We are happy." 输出:"We%20are%20happy."
- 1
- 2
- 3
我们可以利用 c++ 中 string 自带的函数 find 和 replace 解决该题,注意使用规范:
find函数的返回值是整数,假如字符串存在包含关系,其返回值必定不等于npos ,而是返回查找的字符串在该字符串中出现的下标。但如果字符串不存在包含关系,那么返回值一定是 npos 。所以这里要用一个 size_t 类型的变量来接收返回值。replace 函数的一个参数代表要开始替换的下标位置,第二个参数代表要替换字符串中多少个字符,第三个参数是要替换进去的字符串。class Solution {
public:
string replaceSpaces(string& str) {
size_t t;
while ((t = str.find(' ')) != string::npos) {
str.replace(t, 1, "%20");
}
return str;
}
};
另外开一个字符串数组用于存储答案,然后从头往后遍历 str ,如果遇到空格就换成 "%20" 加到 res 中即可。
class Solution {
public:
string replaceSpaces(string& str) {
string res = "";
for (auto x : str)
{
if (x == ' ')
res += "%20";
else
res += x;
}
return res;
}
};
我们可以优化一下空间复杂度,直接在原数组中进行修改:
第一步: 先遍历数组计算最终需要多少个字,如果是空格长度就加 3 ,因为最终一个空格要替换成三个字符;如果是其它字符,就正常加 1 。

第二步: 对 str 进行 resize ,重新定义字符串数组的长度。

第三步: 从后往前遍历,如果不是空格,就将 i 处的字符移到 j 处;如果是空格,则将空格当做三个字符进行替换,这里要注意的是要按照 02% 赋值,这样正序输出时才是 %20 。



class Solution {
public:
string replaceSpaces(string& str) {
//先计算最终数组的长度
int len = 0;
for (auto x : str)
if (x == ' ') len += 3;
else len++;
int i = str.size() - 1, j = len - 1;
str.resize(len); //修改数组长度
//从后往前遍历
while (i >= 0)
{
//如果遇到空格,倒过来放入数组即可
if (str[i] == ' ')
{
str[j--] = '0';
str[j--] = '2';
str[j--] = '%';
}
else str[j--] = str[i];
i--;
}
return str;
}
};
欢迎大家在评论区交流~