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

力扣每日一题 同时被 2 个专栏收录
9 篇文章 6 订阅
1 篇文章 0 订阅

题目描述:

请实现一个函数,把字符串 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;
}
  • 27
    点赞
  • 16
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值