力扣每日一题:剑指offer05——替换空格

Posted 东条希尔薇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣每日一题:剑指offer05——替换空格相关的知识,希望对你有一定的参考价值。

题目描述:

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

输入:s = “We are happy.”
输出:“We%20are%20happy.”

前言
力扣上评论区的许多大佬都已经给出了c++和java实现的方法,但我却没有找到用纯c语言实现的方法,所以我写了这篇博客用来解释这道题的纯c解法,解法可能不如上面两种语言的好,仅供参考~

思路:

这道题,首先要确保一个字符串的大小要足够装的下替换后的字符

经过观察发现:每有一个空格,字符串长度就增加2

解释:一个空格用来放’%’,剩下需要开辟两个额外空间来放置’2’和’0’

然后我们就可以先开辟一个新的字符数组存放我们的新字符串

新的字符串长度=原字符串长度+(空格个数*2)+1(这里的+1是为了存下字符串末尾的’\\0’)

而计算空格的个数,需要遍历一下字符串

//准备工作
	int space_num = 0;
	int len = strlen(s);
	for (int i = 0; i < len; i++)
	{
		if (s[i] == ' ')
		{
			space_num++;//计算空格个数
		}
	}
	char* tmp = (char*)malloc(sizeof(char) * (len + space_num * 2 + 1));//开辟字符串

接下来就是替换了,我们采取从后往前替换的方式

一般用这种顺序操作可以防止数据的过多挪动

替换我们替换到(i+space_num*2)的位置上,因为需要留出足够的空间

等到遇到空格后,就换上"%20",然后space_num–;

画图解释


代码

char* replaceSpace(char* s) {
	int space_num = 0;
	int len = strlen(s);
	for (int i = 0; i < len; i++)
	{
		if (s[i] == ' ')
		{
			space_num++;
		}
	}
	char* tmp = (char*)malloc(sizeof(char) * (len + space_num * 2 + 1));
	for (int i = len; i >= 0; i--)
	{
		if (s[i] == ' ')
		{
			space_num--;
			tmp[i + space_num * 2] = '%';
			tmp[i + space_num * 2 + 1] = '2';
			tmp[i + space_num * 2 + 2] = '0';
		}
		else
		{
			tmp[i + space_num * 2] = s[i];
		}
	}
	return tmp;
}

以上是关于力扣每日一题:剑指offer05——替换空格的主要内容,如果未能解决你的问题,请参考以下文章

算法剑指 Offer 05. 替换空格

剑指offer字符串面试题 替换空格

剑指offer05(Java)-替换空格(简单)

java刷题--剑指offer05 替换空格

剑指 Offer 05. 替换空格

剑指OFFER----面试题05.替换空格