【面试题】剑指offer04--替换字符串中的空格

请实现一个函数,把字符串中的每个空格替换成“%20”。

例如:输入“We are happy.”则输出“We%20are%20happy.”

首先,我们可以画图来表示:


当我们需要将空格换成%20 的时候,则一个空格就要变成三个空格来替换成%20,如图所示:


代码实现的时候,并不是变成三个,而是每有一个空格,则就在将原来的长度上增加2倍的空格的长度。

NewLen = OldLen + BlankNum * 2;
在实现代码的时候,首先要定义算出原来的长度Oldlen,字符串中的空格的个数BankNum,根据空格的个数算出替换字符串后的新数组的长度

第一步是计算原数组的长度和空格的个数:

while (arr[OldLen] != '\0')//当没有到字符串结尾处时,继续执行
	{
		if (arr[OldLen] == ' ')//当遇到空格时,空格个数增加1;
		{
			BlankNum++;
		}
		OldLen++;//只要数组没有到达结尾,length1就增加1
	}
接下来就是进行空格的替换:

while (OldBack != 0)
	{
		if (arr[OldBack] == ' ')
		{
			arr[NewBack--] = '0';
			arr[NewBack--] = '2';
			arr[NewBack] = '%';
		}
		else
		{
			arr[NewBack] = arr[OldBack];
		}
		OldBack--;
		NewBack--;
	}
还有打印数组的函数的实现。

以下是完整的代码:

//请实现一个函数,把字符串中的每个空格替换成“%20”。
//例如:输入“We are happy.”则输出“We%20are%20happy.”。
#include<iostream>
using namespace std;
#include<assert.h>


void ReplaceBlank(char *arr)
{
	assert(arr);
	//先统计字符串的实际长度和空格的个数
	int OldLen = 0;//定义数组的实际长度
	int NewLen = 0;
	int BlankNum = 0;//定义计算数组中的空格的个数
	int NewBack = 0;
	int OldBack = 0;



	while (arr[OldLen] != '\0')//当没有到字符串结尾处时,继续执行
	{
		if (arr[OldLen] == ' ')//当遇到空格时,空格个数增加1;
		{
			BlankNum++;
		}
		OldLen++;//只要数组没有到达结尾,length1就增加1
	}

	NewLen = OldLen + BlankNum * 2;//替换空格后的数组的长度等于原来的长度+空格的长度乘以2
	OldBack = OldLen - 1;
	NewBack = NewLen - 1;
	while (OldBack != 0)
	{
		if (arr[OldBack] == ' ')
		{
			arr[NewBack--] = '0';
			arr[NewBack--] = '2';
			arr[NewBack] = '%';
		}
		else
		{
			arr[NewBack] = arr[OldBack];
		}
		OldBack--;
		NewBack--;
	}
}

void PrintArr(char arr[])//打印数组的函数 
{
	int len = strlen(arr);
	int i = 0;
	for (i = 0; i < len; ++i)
	{
		cout << arr[i];
	}
	cout << endl;
}

int main()
{
	char arr[20] = "We are happy.";
	cout << "替换前的字符串:";
	PrintArr(arr);
	ReplaceBlank(arr);
	cout << "替换后的字符串:";
	PrintArr(arr);
	system("pause");
	return 0;
}
代码实现的结果:








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值