剑指offer--------替换空格

本文介绍了一种将字符串中的空格替换为“%20”的算法实现,提供了两种不同的实现思路:一种是逐个遍历并替换空格;另一种是从字符串的末尾开始替换,以降低时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:实现一个函数,把字符串中的每个空格替换成“%20”。如输入“We are happy.”,输出“We%20are%20happy.”。

思路1:遍历字符数组,每遇到一个空格,则将其替换。因将空格替换成‘%20’,则替换后,字符数组的长度增2,即需将当前空格后面的字符依次向后移动两个位置,避免发生覆盖。

思路1的实现

void replaceBlank(char str[], int capacity)
{
	int i = 0;
	int numberOfBlank = 0;
	for (int i = 0; str[i] != '\0';i++)
	{
		if (str[i] == ' ')numberOfBlank++;
	}
	if (strlen(str)+1 + numberOfBlank * 2 > capacity)      //保证数组总容量能满足替换后所需容量。
	{
		cout << "原字符数组预定容量不足...." << endl;
		return;
	}
	while (str[i] != '\0')
	{
		if (str[i] == ' ')
		{
			int len = strlen(str);//strlen的参数只能是char*;返回值不包含'\0';
			for (len;len >= i;len--)
				str[len + 2] = str[len];
			str[i++] = '%';
			str[i++] = '2';
			str[i++] = '0';
		}
		else i++;
	}
}

思路2:先遍历一遍字符数组,统计出数组中的空格数量,计算出替换后数组的长度,然后设置两指针P1、P2,P1指向原字符数组的末尾,P2针指向替换后字符数组的末尾,从后往前开始遍历和替换:移动P1指针,把P1指向的字符依次复制到P2指向的位置,当碰到一个空格时,在P2的当前位置依次插入“%20”,然后P1向前移动一个位置,重复以上操作,直到P1与P2指向同一位置时,说明字符数组中的空格替换完毕。该算法中,时间复杂度为o(n),空间复杂度为o(1)。

思路2的实现

void replaceBlank(char str[], int capacity)
{
	int i = 0;
	int numberOfBlank = 0;
	for (int i = 0; str[i] != '\0'; i++)
	{
		if (str[i] == ' ')numberOfBlank++;
	}
	if (strlen(str) + 1 + numberOfBlank * 2 > capacity)
	{
		cout << "原字符数组预定容量不足...." << endl;
		return;
	}
	int len = strlen(str);
	int newlen = len + numberOfBlank*2;
	while (len >= 0 && newlen > len)
	{
		if (str[len] == ' ')
		{
			str[newlen--] = '0';
			str[newlen--] = '2';
			str[newlen--] = '%';
		}
		else
		{
			str[newlen--] = str[len];
		}
		len--;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值