剑指offer 面试题5:替换空格【C++版本】

题目总结与代码归档:
【剑指offer-2】题目目录【C++版本】

GitHub代码路径: GitHub

面试题5

替换空格

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

解题思路

空格替换成“%20”,字符串会变长。
如果能够创建新的字符串,那么题目就变得很简单,1、新分配足够的内存,用于存放变长后的字符串。2、扫描原字符串,遇到空格替换为“%20”,依次放入新分配足够的内存中

如果在原字符串上操作并且保证输入的原字符串后有足够空间,
A、从前向后: 这存在数据的重复搬移,时间复杂度高(不可取)
B、从后向前:先扫描原字符串获取空格个数,计算出新字符串(替换空格后)长度,从后向前搬移替换原字符串到新字符串(只需要搬移一次)
在这里插入图片描述
在这里插入图片描述

代码实现

# include<iostream>

using namespace std;

void replaceSpace(char str[], int length);

int main()
{
	char test[15] = "We Are Happy.";
	cout << "Before:"<< test << endl;

	replaceSpace(test, 15);

	cout << "After:" << test << endl;
	system("pause");
	return 0;
}

// length 为字符数组 str 的总容量
void replaceSpace(char str[], int length) {
	if (str == nullptr || length <= 0) {
		return;
	}
	int originalLength = 0; // 原始字符串的长度
	int numberOfBlank = 0; // 空格的个数

	int i = 0;	// 扫描 原始字符串,计数空格个数 以及 原始字符串的长度, 不包括结束符
	while (str[i] != '\0') {
		++originalLength;

		if (str[i] == ' ') {
			++numberOfBlank;
		}
		i++;
	}

	/* 计算 newLength,  为把空格替换成 '%20' 之后的长度*/
	int newLength = originalLength + numberOfBlank * 2;	// 空格 -> %20 多了两个字符
	if (newLength > length) {	// 是否超出字符数组大小
		cout << "Out of range" << endl;
		return;
	}

	int indexOfOriginal = originalLength; // index 数组下标从 0 开始,这里包括结束符 所以不用-1
	int indexOfNew = newLength; 

	while (indexOfOriginal >= 0 && indexOfNew > indexOfOriginal) {
		if (str[indexOfOriginal] == ' ') {	// 替换空格
			str[indexOfNew--] = '0';
			str[indexOfNew--] = '2';
			str[indexOfNew--] = '%';
		}
		else {
			str[indexOfNew--] = str[indexOfOriginal];	// 搬移数据
		}

		--indexOfOriginal;	//  从后向前
	}
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200324002411718.png
在这里插入图片描述

参考资料:


GitHub链接:
https://github.com/lichangke
优快云首页:
https://me.youkuaiyun.com/leacock1991
欢迎大家来一起交流学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值