《程序员面试金典》--空格替换

题目描述:

   请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。给定一个string iniString 为原始的串,以及串的长度 int len, 返回替换后的string。

测试样例:  "Mr John Smith”,13       返回:"Mr%20John%20Smith"
           ”Hello World”,12       返回:”Hello%20%20World”
思路一:
    首先想到的是另外新建一个字符串,将原有字符串依次顺序遍历复制到新建字符串中,如果遇到空格,则复制三个字符“%20”,这样多出两个字符,每遇到一个空格就多两个字符,所以如果是字符串数组的情况下,需要先遍历一次原字符串,求出空格个数,然后新建字符串的总长度=原字符串的长度+空格个数*2,这样可以顺序遍历实现替换。
    这样时间上只需要遍历两次字符串,空间却需要多一份拷贝。
思路二:
    如果容许修改原字符串的情况下,可以在原字符串通过移动字符实现,我们普通的想法是从第一个字符开始移动,那么每遇到一个空格,字符串后面的部分就要整体往后移动两个字符,那么时间复杂度为O(N*N),显然不是理想的做法。
    换一个角度想,如果从最后一个字符开始移动,首先统计好空格的个数,那么最后一个字符对应的移动位置就确定了,那么没个字符只需要移动一次,这样的时间复杂度为O(N),空间上也会少 一份拷贝,从空间和时间的角度出发,都是最优的。
代码实现如下:
string replaceSpace(string iniString, int length) {
        // write code here
		if(iniString.empty()||length<=0)
			return string();
		int spaceNum=0;
		for(int i=0;i<length;++i)
		{
			if(iniString[i]==' ')
				++spaceNum;
		}
		iniString.resize(length+spaceNum*2);
		int i=length+spaceNum*2-1;
		for(int j=length-1;j>=0;--j)
		{
			if(iniString[j]==' ')
			{
				iniString[i]='0';
				iniString[i-1]='2';
				iniString[i-2]='%';
				i=i-3;
			}
			else
				iniString[i--]=iniString[j];
		}
		return iniString;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值