04 空格替换

【题目描述】

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

给定一个string iniString 为原始的串,以及串的长度 int len, 返回替换后的string。

测试样例:

1."Mr John Smith”,13     返回:"Mr%20John%20Smith"

2.”Hello World”,12     返回:”Hello%20%20World”


【思路1】直接替换

public String replaceSpace(String iniString, int length) {
    return iniString.replaceAll(" ","%20");
}

【思路2】StringBuffer

public String replaceSpace1(String iniString, int length) {
	if (iniString == null || length < 0) {
		return null;
	}
	StringBuilder newStr = new StringBuilder();
	for (int i = 0; i < iniString.length(); i++) {
		if (iniString.charAt(i) == ' ') {
			newStr.append('%');
			newStr.append('2');
			newStr.append('0');
		} else {
			newStr.append(iniString.charAt(i));
		}
	}
	return newStr.toString();
}

【思路3】

不允许额外开辟空间,如果采取每遇到一个空格就把空格后的字符往后挪,算法复杂度无疑太高。

先计算出字符串的总长度,遍历一遍得到空格数,得到替换后的字符串长度,然后用两个指针分别指向原始字符串的末尾位置和目标字符串的末尾位置(同在这个字符数组中),由后往前进行复制和替换。这样做的好处是所有字符都只复制一次。

算法复杂度为O(n)

public String replaceSpace2(String iniString, int length) {
	if (iniString == null || length < 0) {
		return null;
	}
	int originalLength = length;// 实际长度
	int numofBlack = 0;// 空格数
	for (int i = 0; i < length; i++) {
		if (iniString.charAt(i) == ' ')
			++numofBlack;
	}
	// 判断是否存在空格
	if (numofBlack > 0) {
		int newLength = originalLength + numofBlack * 2;// 长度
		char[] ch = new char[newLength];
		int indexOfOriginal = 0;// 旧数组下标
		int indexOfNew = 0;// 新数组下标
		while (indexOfOriginal < originalLength && indexOfNew < newLength) {
			if (iniString.charAt(indexOfOriginal) == ' ') {
				ch[indexOfNew++] = '%';
				ch[indexOfNew++] = '2';
				ch[indexOfNew++] = '0';
				indexOfOriginal++;
			} else {
				ch[indexOfNew++] = iniString.charAt(indexOfOriginal++);
			}
		}
		return String.valueOf(ch);
	} else {
		return String.valueOf(iniString);
    }
}
	

【思路4】正则

public String replaceSpace3(String iniString, int length) {
	return iniString.replaceAll(" ", "%20");
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值