剑指offer(一):替换空格 字符串 C语言

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;

}

猜你喜欢

转载自blog.csdn.net/weixin_39087263/article/details/82847695