剑指offer----替换空格

在"we are happy"这个字符串中,将所有的空格替换成字符串%20。

分析:当看到这个题目时,我们就会想着遍历字符串嘛,遇到空格替换成%20,可是空格只有一个字节,%20是3

节,明显是不够的,所以我们遇到把字符串整体后移(字符串只能存放在数组中),这样,空格越多,后边的字

符移动的次数也越多。(记住:移动的时候一定要移动\0)这样,如果我们一次移动到位,这样是不是好一点呢??

我们将后边也就是最后一个字符一次移动到位,(2个空格,移动4位)。然后从后向前依次改写就好(遇到空格就改

成%20)否则,直接复制。看下边的代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
void fillblack(char *arr)
{
	assert(arr);
	int len = strlen(arr);
	int blacks = 0;
	char *oldEnd = arr + len;
	char *newEnd = arr + len ;
	while (*arr++)
	{
		if (*arr == ' ')
			blacks++;
		
	}
	newEnd += 2 * blacks;
	while (oldEnd <= newEnd)
	{
		if (*oldEnd != ' ')
		{
			*newEnd-- = *oldEnd--;
		}
		else
		{
			*newEnd-- = '0';
			*newEnd-- = '2';
			*newEnd-- = '%';
			oldEnd--;
		}
	}
}
int main()
{
	char arr[20] = "we are happy";
	fillblack(arr);
	printf("%s",arr);
	system("pause");
	return 0;
}
复制操作循环结束的条件:当新串的指针与旧串的指针指向相等时(也就是复制到字符串的第一个单词时)就不需要

复制了,当然你复制也没关系,只是无用功罢了。

这个题目,同学也有整理过,他给出了另外一种方法,我觉得比较好:主函数另外再给出一个数组作为实参传给操作

函数,这个数组存放改后的字符串。具体操作:从前向后,当遇到空格时,成%20,其他的直接复制就好。这

里就不给出代码,有兴趣的自己实现。

其实%20也不是随机给的,你可以在浏览器下看看就知道了。

以上如有不合理,请指出~~


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值