请实现一个函数,把字符串中的每个空格替换成 %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 所指向的字符不为空,就进行复制操作,否则的话就进行替换操作。最后返回新生成的字符串。