版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39087263/article/details/82847695
题目: 替换空格
请实现一个函数,将一个字符串中的空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路1:建立两个数组 ,一个存放原来的,一个存放替换后的 时间复杂度过高O(n^2) ,代码如下:
#include<stdio.h>
#include<string.h>
#include<assert.h>
int InsteadBlank_1(char *str1,char *str2)
{
assert(str1!=NULL);
while(*str1)
{
if(*str1!=' ')
{
*str2= *str1;
*str2++;
}
else
{
strcpy(str2,"%20");
str2 = str2+3;
}
*str1++;
}
*str2 = '\0';//调用strcpy 手动加一个'\0'
return 0;
}
int main()
{
char str1[]="we are happy";
char str2[20];
InsteadBlank_1(str1,str2);
printf("%s \n ",str2);
getchar();
return 0;
}
思路2
1.判断:计算原来的count长度, 计算空格数
2.求更改之后的长度,一个空格多加两个单位长度 ' ' ----> '%20'
3.赋值操作: 从后往前赋值。 如果遇到' ',就将%20 从后往前依次赋给相应的位置。
具体操作如下:
1.先遍历一次字符串,这样就可以统计出字符串空格的总数,并可以由此计算出替换之后的字符串的总长度。
每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。
例如: "we are happy. " 加上空格一共有14个字符(包括'\n'),如果转换为"we%20are%20happy",一共18个字符
2. 从字符串的尾部开始复制和替换。首先准备两个指针,P1和P2,P1指向原始字符串的末尾,P2指向替换之后的字符串的末尾。
向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。
碰到第一个空格之后,把P1向前移动1格,在P2之前插入字符串"%20"。由于"%20"的长度为3,同时也要把P2向前移动3格。
如图所示:
#include<stdio.h>
#include<string.h>
#include<assert.h>
void InsteadBlank_2(char *str,int length)
{
assert(*str!=NULL);
if(str==NULL || length ==0) //判断str是否为空,以及字符串的长度
{
return ;
}
int BlankNum = 0; //空格数
int OldLength = 0; //原字符串长度
int i=0;
while(str[i++]!='\0') //遍历字符串
{
if(str[i] ==' ') //当遇到空格的时候
{
BlankNum++; //空格数目进行累加操作
}
OldLength++; //字符串长度计算
}
int NewLength_Index = OldLength +BlankNum*2; //将空格数目-->%20 所需要的长度 设为指针p2
int OldLength_Index = OldLength; //之前的长度 设为指针p1
while(OldLength_Index>=0 && OldLength_Index<NewLength_Index)
{
if(str[OldLength_Index] == ' ') //从后向前遍历,遇到空格,就将%20从后往前进行赋值操作
{
str[NewLength_Index--] = '0';
str[NewLength_Index--] = '2';
str[NewLength_Index--] = '%';
}
else//没有空格,直接赋值
{
str[NewLength_Index--]=str[OldLength_Index] ;
}
OldLength_Index--;
}
}
int main()
{
char str3[]="we are happy.";
int length = strlen(str3);
InsteadBlank_2(str3,length);
printf("%s",str3);
getchar();
return 0;
}