《剑指offer》面试题5:替换空格

题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出“We%20are%20happy.”。


思路:

如果从头到尾扫描字符串,总的时间效率是O(n^2);我们换一种思路,把从前向后替换改成从后面向前替换,效率可达到O(n)。

基于以上思路,java参考代码如下:

public class ReplaceSpaces {
    //由于java的字符数组没有结束符,所以需要多传入个原始长度
    //先计算好替换后的位置,从后向前替换,时间复杂度o(n)
    public static void replaceBlank(char[] data,int length){
        int newLength = length;//不改变原有length的值
        for(int i=0;i<length;i++){
            if(data[i]==' ')
                newLength += 2;//注意点1:加2不是3,原本有一个空格
        }
        for(int indexOfOld = length-1,indexOfNew=newLength-1;indexOfOld>=0 && indexOfOld!=indexOfNew;indexOfOld--,indexOfNew--){
            if(data[indexOfOld]==' '){
                data[indexOfNew--] = '0';
                data[indexOfNew--] = '2';
                data[indexOfNew] = '%'; //indexOfNew不用再自减操作,填充了原来的空格
            }
            else{
                data[indexOfNew] = data[indexOfOld];//注意点2:没有用另外的新数组,而是在原数组上移动,节省内存空间,且可不用返回数组。
            }
        }
    }
    public static void main(String[] args){
    	//char[] preda=new char[]{'w',' ','a','r',' e',' ','h','a','p','p''y','.'};//注意点3:可以用原始的声明字符数组的方式,也可以用字符串转字符数组的方式。
        char[] predata = "We are happy.".toCharArray();//将String类型转化为Char[]类
        char[] data = new char[20];
        for(int i=0;i<predata.length;i++)
            data[i] = predata[i];
        System.out.println(data);
        replaceBlank(data,predata.length);
        System.out.println(data);
    }
}

注意事项见代码注释部分。

C++参考代码如下:

/*length 为字符数组string 的总容量*/
void ReplaceBlank(char sring[],int length)
{
	if(string==nullptr || length<=0)
		 return;

	/*originalLength 为字符串 string 的实际长度*/
	int originalLength=0;
	int numberOfBlank=0;
	int i=0;
	while(string[i]!='\0')
	{
		++originalLength;
		if(string[i]==' ')
			++numberOfBlank;
		
		++i;
	}

	/*newLength  为把空格替换成“%20”之后的长度*/
	int newLength=originalLength+numberOfBlank*2;
	if(newLength>length)
		return

	int indexOfOriginal=originalLength;
	int indexOfNew=newLength;
	while(indexOfOriginal>=0 && indexOfNew>indexOfOriginal)
	{
		if(string[i]==' ')
		{
			string[indexOfNew--]='0';
			string[indexOfNew--]='2';
			string[indexOfNew--]='%';
		}
		else
		{
			string[indexOfNew--]=string[indexOfOriginal];
		}
		--indexOfOriginal;
	}
}
测试用例:

a.输入的字符串中包含空格(空格位字符串的最前面;空格位于字符串的最后面;空格位于字符串的中间;字符串中有连续多个空格)。
b.输入的字符串中没有空格。
c.特殊输入测试(字符串时一个nullptr 指针;字符串是一个空字符串;字符串只有一个空格字符;字符串中有连续多个空格)。

参考:
https://www.jianshu.com/p/0135b2e13f41

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值