题意
请实现一个函数,把字符串中的每个空格替换成”$\%20$”。
数据范围
$0 \leq $ 输入字符串的长度 $\leq 1000$
注意输出字符串的长度可能大于 $1000$。
样例
输入:"We are happy."
输出:"We%20are%20happy."
这道题,我说两种方法,一种是开额外数组,一种是不开额外数组。
NO.1 开额外数组
思路是开一个额外字符串$ans$,从前往后遍历一遍$str$,如果是空格那么把$\%20$接在ans的后面;否则直接把这个字母接在$ans$的后面。
代码实现:
class Solution {
public:
string replaceSpaces(string &str) {
string ans;
for (int i = 0; i < str.size(); i ++)
if (str[i] == ' ')
ans += "%20";
else
ans += str[i];
return ans;
}
};
NO.2 不开额外数组
我们可以从前往后遍历一遍$str$,如果是空格,就把空格删掉,再往原来空格的位置插入$\%20$。
代码实现:
class Solution {
public:
string replaceSpaces(string &str) {
for (int i = 0; i < str.size(); i ++)
{
if (str[i] == ' ')
{
str.erase(str.begin() + i);
str.insert(i, "%20");
}
}
return str;
}
};
两种方法都讲完了,但作为一个善良的人,我还是得说一下这两个代码中用到的$string$操作。
1. a += b;
表示把$string$类型的$b$接到$a$的后面。
2. str.erase(str.begin() + i);
表示删除$str$的第$i + 1$个元素,顺便提一句,$str.begin()$是$str$的开头的指针(第$0$个字符的),$+i$就是第$i$个字符的指针。
3. str.insert(i, "%20");
表示在$str$的第$i$个字符前插入字符串$\%20$,与前面不同的是,并不需要传指针。
好了,这就是这篇题解的全部内容了。
让我们……
下次有缘再见!
$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\mathcal{writer\enspace by \enspace acwing}$ : $\mathfrak{天元之弈}$
第二点讲错了,应该是删除下标为i的元素,即第i+1个元素
感谢指正!
虽然你解法二不错 但不是双指针算法
不开额外数组的方式在删除的过程中也可使用 str.erase(i,1) ,表示删除从 i 位置开始的 1 个字符。
嗯,是的