请实现一个函数,把字符串中的每个空格替换成 %20
。例如输入 We are happy.
,则输出 We%20are%20happy.
。
分析
方法一:首先计算出将空格替换成 %20
后的字符串长度,然后从前往后遍历字符串。只要遇到空格就填充 %20
,不过这种方式会将处于 happy
的字符移动两次,时间复杂度为O(n^2)。
方法二:也是先计算出将空格替换成 %20
后的字符串长度,这时从后往前遍历字符串,设置一个指向原始字符串的标志 indexOfOriginal
,再设置一个指向替换空格之后的字符串的标志 indexOfNew
,让这两个标志往前挪动。在 indexOfOriginal
向前移动的过程中,如果没有遇到空格,就将 indexOfOriginal
所指向的字符复制给 indexOfNew
所指向的地方;如果遇到空格了,就将空格替换成 %20
即可。
实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public class ReplaceSpaces {
public static String replaceSpaces(StringBuffer str) {
String str1 = str.toString();
if (str1.equals("")) return str1;
char[] strArray = str1.toCharArray();
int i = 0;
int lengthSpaces = 0;
while (i < strArray.length) {
if (strArray[i] == ' ')
lengthSpaces++;
i++;
}
int newStrLength = strArray.length + lengthSpaces * 2;
char[] newStr = new char[newStrLength];
int indexOfOriginal = strArray.length - 1;
int indexOfNew = newStrLength - 1;
while (indexOfOriginal >= 0) {
if(strArray[indexOfOriginal] != ' '){
newStr[indexOfNew--] = strArray[indexOfOriginal--];
}else{
newStr[indexOfNew--] = '0';
newStr[indexOfNew--] = '2';
newStr[indexOfNew--] = '%';
indexOfOriginal--;
}
}
return new String(newStr);
}
}
|
详解
首先将原始字符串转换成字符数组,第 9~13
行统计原始字符串中的空格数量。第 14
行计算将空格替换成 %20
后的字符串的长度。第 16~17
行就是之前分析的标志。第 19~20
行,只要 indexOfOriginal
所指向的字符不为空,就进行复制操作,否则的话就进行替换操作。最后返回新生成的字符串。