面试题5:替换空格
题目:实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出“We%20are%20happy.”。
解题思路:
- 遍历字符串,求出公有多少个字符,和有多少个空格;
- 因为要将空格替换成“%20”,意味着一个空格要增加两个长度。
- 所以新的字符长度为 原有长度+空格长度*2;
- 这是一个指针p1,放在久长度尾部,p2,放在新长度尾部。
- 将p1指向的字符移动到p2指向的位置,若字符为空格,则替换成“%20”,此时时间复杂度为O(n);
void ReplaceBlank(char *c){
if(!c) return;
int oldLen=0;//久长度
int blanknum=0;//空格数
while(c[oldLen]!='\0'){
if(c[oldLen]==' ') ++blanknum;
++oldLen;
}
int newLen=oldLen+2*blanknum;//新长度
int p1=oldLen;//p1指向久尾部
int p2=newLen;//p2指向新尾部
while(p1!=p2){
if(c[p1]!=' ') {//碰到字符,移动
c[p2]=c[p1];
--p1;
--p2;
}
else {//碰到空格,替换
c[p2--]='0';
c[p2--]='2';
c[p2--]='%';
p1--;
}
}
for(int i=0;i<newLen;i++){
cout<<c[i];
}
}