替换空格

题目:

实现一个函数,把字符串的每个空格替换成"%20".例如把"We are  happy,"输出为

"We%20are%20happy"

解法一:正向扫描字符串,遇到空格就填入"%20",由于要移动空格后面的字符串,假设字符串的 长度为n,则时间复杂度是n*n

解法二:

逆向扫描数组去复制,时间复杂度达到O(n)。因此开的数组要足够大,由于一个空格替换后比原来多两个字符,所以新的长度比原来长 2*(空格数量)

执行过程如下图:

模拟过程


void ReplaceBlank(char string[], int length)//字符串和字符数组预定操作空间
{
	if(string == nullptr || length <= 0)
		return ;
	int numBlank = 0;//空格数目
	int numChar = 0;//字符数目
	for(int i = 0; string[i] != '\0'; i++)
	{
		if(string[i] == ' ')
			numBlank++;
		else 
			numChar++;
	}
	
	numChar++;//加上'\0'这个结尾字符
	//cout<<numChar<<endl;
	//system("pause");
	int orginalLength = numBlank + numChar;//原本长度
	int newLength = numBlank*2 + orginalLength;//替换后的长度
	//cout<<orginalLength<<" "<<newLength<<endl;
	//system("pause");
	if(newLength > length)//预留的长度不够
		return ;
	int p1 = orginalLength - 1;//指向原本字符串的末尾
	int p2 = newLength  -1; //指向新字符串的末尾

	while(p1 >= 0)//没有读完
	{
		if(string[p1] == ' ')
		{
			string[p2] = '0';
			string[p2 - 1] = '2';
			string[p2 - 2] = '%';
			p2 -= 3;
			p1--;
		}
		else
		{
			string[p2] = string[p1];
			p1--;
			p2--;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值