题目内容
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
思路:
- 前导知识:在网络编程中,服务器可能因为特殊字符而无法获得正确的参数,所以要将特殊符号换成ASCII。转换的规则是在
%
后面加上对应的ASCII两位十六位进制表示。- 比如,空格的ASCII码是32,即十六进制的
0x20
,因此空格被替换成%20
- 比如,空格的ASCII码是32,即十六进制的
- 题目分析:将空格替换成
% 2 0
三个字符的话,字符串会变长,所以需要向面试官问清楚是在原字符串上修改还是可以新开一个字符串。 - 方法1:每次替换时,都要将后面所有数往后移2位以防止覆盖,时间复杂度为O( n 2 n^2 n2),不够快,那还有更快的方法吗?
- 方法2:从前往后很麻烦的话,可以考虑从后往前替换。
- 我们可以先将字符串从头到尾遍历一遍,计算出总共需要替换的空格数目。
- 然后因为每替换一个空格,总长度就要增加2,所以替换以后的字符串长度就等于
原数组+空格数*2
. - 我们从字符串的后面开始复制和替换,需要用到两个指针p1,p2。p1指向原字符串的末尾,p2指向替换之后的字符串末尾。
- 移动p1,p2逐个复制字符,直到碰到空格,碰到空格后,p1向前移动1格,p2在前面插入
%20
之后,移动3格。 - 重复上述步骤直到p1p2指向同一位置表示复制结束。
class Solution {
public:
string replaceSpace(string s) {
int slen=s.size();//原字符串长度
int blank=0;//记录空格个数
//遍历 统计所有空格个数
int i=0;
while(s[i]!='\0'){
if(s[i]==' ')blank++;
++i;
}
int newlen=slen+2*blank;//替换完全之后新字符串的长度
s.resize(newlen);//修改字符串长度
int p1=slen-1;//p1指向原数组末尾,一定记得字符串多出来的‘\0’,所以p1p2要-1
int p2=newlen-1;//p2指向新数组末尾
while(p1>=0 &&p2>p1){
if(s[p1]==' '){
s[p2--]='0';
s[p2--]='2';
s[p2--]='%';
}else{
s[p2--]=s[p1];
}
--p1;
}
return s;
}
};