【面试题】剑指Offer-4-替换空格

题目概述

实现一个函数,可以把字符串的每个空格替换成“%20”.例如输入"We are human",输出"We%20are%20human".

考点

这道题目考验了面试者对内存覆盖是否存有高度的警惕,只要保持冷静,思考到从后往前的替换方法,就很好解决了

方法步骤

1、遍历一遍字符串,找出空格的个数count

2、将字符串扩容到对应长度

3、从后往前进行拷贝

4、根据当前的count计算替换的位置tmp

遇到需要替换的字符时,用replace进行替换,然后tmp减去对应长度;

否则直接拷贝到对应位置上;

5、如此反复直到tmp为0


代码实现

#include<iostream>
using namespace std;
#include<string>
#include<assert.h>

//替换空格
//src代表被替换的字符
//des是替换的目标字符串
void ReplaceChar(string& str,const char src = ' ', const string& des = "%20")
{
	assert(!str.empty());
	assert(!des.empty());

	//获得需要修改字符串的数量,从而求出拷贝的差值,以及拷贝后字符串的长度
	size_t count = 0;
	for (size_t i = 0; i < str.length(); ++i)
	{
		if (str[i] == src)
			count++;
	}

	size_t oldSize = str.length();
	size_t tmp = (des.length() - 1)*count;

	//将string扩容到对应大小
	str.resize(oldSize + tmp);

	//进行拷贝
	for (int i = oldSize; i >= 0; i--)
	{
		//如果碰到需要修改的字符,则用replace函数进行替换
		//如果不是需要修改的字符,则直接往后拷贝到对应的位置上
		if (str[i] == src)
		{
			//replace(size_t pos,size_t length,const string& s)
			str.replace(i + tmp - des.length() + 1,des.length(),des);

			//拷贝后,tmp减去相应的位数
			tmp -= (des.length()-1);
			if (tmp == 0)
				return;
		}
		else
		{
			str[i + tmp] = str[i];
		}
	}
}

void TestReplaceChar()
{
	string s("We are human");
	ReplaceChar(s);
	cout << s << endl;
}

int main()
{
	TestReplaceChar();
	return 0;
}

小结

合并两个字符串或者数组时,如果从前往后需要挪动很多字符,那么就要考虑从后往前的替换方法

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值