替换空格

题目:请实现一个函数,把字符串中的每个空格替换成“%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;
}

运行截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值