剑指Offer每日一刷 -2017年11月11日

题目描述

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
方法一:使用JDK API进行替换
public class ReplaceBackspace {

	    public String replaceSpace(StringBuffer str) {
	    	String string = str.toString();
	    	String replace = string.replace(" ", "%20");
	    	return replace;
	    }

}

方法二:
/*
问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换!
问题2:在当前字符串替换,怎么替换才更有效率(不考虑java里现有的replace方法)。
       从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下
       从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。
思路是:1.先计算出str中有多少个 空格;
2.计算出将空格替换成"%20"后,str的长度newLength
3.设置str的长度为newLength,长度会增加,新增加的长度没有值
4.对str按照原有长度从后向前遍历,将每个字母按照新的长度从后向前进行赋值,
赋值到后面之后字母所在的原位置就可以被其他符号占用,且不会影响到原有的字符。
5.遇到空格后,插入'0','2','%'
*/
 public String replaceSpace(StringBuffer str){
	    	//统计str中的space个数
	    	int spaceNum = 0; //记录space的个数
	    	for(int i=0;i < str.length();i++){
	    		if(str.charAt(i) == ' '){ //判断i索引处的char字符是否是' '
	    			spaceNum ++;
	    		}
	    	}
	    	
	    	int oldLength = str.length();
	    	int newLength = str.length()+ spaceNum*2; //%20占有三个字符才长度,所以在原有的space的基础上添加spaceNum*2
	    	
	    	int oldIndex  = oldLength-1;
	    	int newIndex = newLength-1;
	    	
	    	//StringBuffer newStr;
	    	str.setLength(newLength);
	    	//对已有的str从后向前遍历,遇到 ' '时 插入'%', '2','0'
	    	for(;oldIndex>=0 && oldIndex < newLength;--oldIndex){
	    		if(str.charAt(oldIndex) == ' '){
	    			str.setCharAt(newIndex--,'0');
	    			str.setCharAt(newIndex--, '2');
	    			str.setCharAt(newIndex--, '%');
	    		}else{
	    			str.setCharAt(newIndex--, str.charAt(oldIndex));
	    		}
	    	}
	    	return str.toString();
	    	
	    }

方法三:
 public static String replaceSpace(StringBuffer str){
		   if(str==null)
		   {return "%20";}
		   		 
		   char[] ss = str.toString().toCharArray();
		   StringBuffer sb = new StringBuffer();
		   for(int i=0;i<ss.length;i++){
			   if(ss[i] == ' '){
				   sb.append("%20");
			   }else{
				   sb.append(ss[i]);
			   }
		   }
		   return sb.toString();
	   }





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值