剑指offer——2. 空格替换

这个不难,只需要一些语言知识即可。主要针对过程中出现的问题一些记录一下。

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。


1. 使用replace:

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

其实只需要一句return str.toString.replace(" ","%20")就可以解决了~

注意replace方法需要返回一个字符串,而不是直接在当前字符串上改变,开始忘记了,直接用的注释那句,怎么返回都不对……,想了半天。

 

2. split方法:(错误示范)

public String replaceSpace(StringBuffer str) {
		String str2 = str.toString();
		String[] st = str2.split(" ");
                //是否以" "开头
		boolean first = str.indexOf(" ") == 0 ? true : false;
                //是否以" "结尾
		boolean last = str.lastIndexOf(" ") == str.length() - 1 ? true : false;
		str.setLength(0);
		if (first) {
			str.append("%20");
		}
		for (int i = 0; i < st.length; i++) {
			str.append(st[i]);
			if (i < st.length - 1) {
			    str.append("%20");
			}
		}
		if (last) {
			str.append("%20");
		}
		return str.toString();
	}

开始想用split方法,以" "分割,但实践了一下,发现存在很多问题:

      1)当头部为一个空格时,st[0]为空字符""

      2)当头部连续空格时,有几个空格,数组前面几位就是""

      3)当中间出现一个空格时,如:"hello worle",正常分割为:hello,world,没有空字符

      4)当中间出现多个连续空格时,如:"hello   worle"(中间3个空格),数组中为:hello,"","",world,2个空字符

      5)尾部出现字符时,如果使用的是split(String regex),则尾部空格忽略,无空字符,如果使用的是split(String regex,str.length()),则尾部字符也会出现....同样也是有几个空格就追加几个空字符

      6)综上,这逻辑真的好难啊,感觉在遍历的时候还需要判断一下上一个元素以及下一个元素是不是空字符来决定要不要加%20,总是我已经炸毛了,遂放弃。

 

3. 使用getChars方法转为数组遍历

public String replaceSpace(StringBuffer str) {
                int len = str.length();
		char[] st = new char[len];
		str.getChars(0, len , st, 0);
		str.setLength(0);
		for (int i = 0; i < len; i++) {
			if (st[i] == ' ') {
				str.append("%20");
			} else {
				str.append(st[i]);
			}
		}
		return str.toString();
	}

这里的问题是getChars的参数

getChars(int srcBegin, int srcEnd, char[] dst,int dstBegin):

截取的是srcBegin到srcEnd-1之间的String,所以是0到str.length,如果当作索引的话会导致最后少一位。

 

4. AtChar+replace,这个是别人的方法,测试出来的效率也是最快的,只需要查询并修改一部分即可。果然最好的方法还是别人先出来的😂,我在查API的时候看到了AtChar方法都没想到要这么用.. 

	public String replaceSpace(StringBuffer str) {
		int n = str.length();
		for (int i = 0; i < n; i++) {
			if (str.charAt(i) == ' ') {
				n += 2;
				str.replace(i, i + 1, "%20");
			}
		}
		return str.toString();
	}

这里面n += 2是为了让遍历的时候i < n不出错~

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值