【题目描述】
请编写一个方法,将字符串中的空格全部替换为“%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");
}