题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“we are happy”,则输出“we%20are%20happy”。
解题思路:
转换的规则是在 %后面跟上ASCII码的两位十六进制的表示。
即为 原来一个空格字符现在要替换成 ‘%’, ’2’, ’0’这三个字符,原本一个空格字符占用一个字节,现在将会增加空格2个字节,所以现在总的字符串会变长,即增加 空格数*2 个字节长,我们必须要把空格后面所有的字符都后移2个字节,否则就有两个字符被覆盖了。
我们从头开始扫描整个字符串,找到所有的空格,对每个空格字符进行替换,都需要移动后面的字符,例如下面这个过程:
这样的话时间复杂度就是o(n^2),
如果想要更加简单更快的话,则可以从字符串的后面开始扫描,进行复制替换。可以准备两个指针,p1和p2, p1指向原始字符串的尾部,p2指向替换后的字符串的尾部,然后开始向前移动指针p1,逐个把指向的字符复制到p2指向的位置,直到碰到第一个空格为止。把p1向前移动一个格子,在p2之前插入字符串“%20”,由于“%20”的长度为3,同时也要把p2向前移动3个格子。直到p1和p2指向同一个位置,便表明所有空格都已经替换完毕。时间复杂度:o(n).
例如下面的这个过程:
源代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void ReplaceBlank(char str[],int lenth) //lenth为字符数组的总长度
{
int numblack=0;
char *ptr=str;
int originallenth=strlen(str); //原始的字符数组长度
int newlenth=0;
if(str==NULL&&lenth<=0)
{
return;
}
while(*ptr)//先统计出空格的数量
{
if(*ptr==' ')
{
numblack++;
}
ptr++;
}
if(numblack==0)
{
return;
}
newlenth=originallenth+2*numblack; //字符数组替换后新长度,原来的长度 加上 空格数*2
if(newlenth>lenth)
{
return;
}
while(originallenth<newlenth)
{
if(str[originallenth]!=' ')//依次复制字符串内容
{
str[newlenth--]=str[originallenth--];
}
else//空格替换
{
originallenth--;
str[newlenth--]='0';
str[newlenth--]='2';
str[newlenth--]='%';
}
}
}
int main()
{
char str[50]="we are happy";
ReplaceBlank(str,50);
printf("%s\n",str);
return 0;
}
运行截图: