题目:请实现一个函数,把字符串的每个空格替换成“%20”。例如输如:“We Are Happy”,则输出“We20%Are20%Happy”。
第一种方法是一种时间复杂度为O(n^2)的方法,即每碰到一个空格就替换,这种想法的缺点很明显,每次移动都需要移动后面所有的字符,为了减少字符的移动次数,我们可以从后往前替换空格。
第二种方法是一种时间复杂度为O(n)的方法,即用两边遍历,第一遍遍历整个字符数组,找出所有的空格数。直接申请一个正好大小的数组,再用一遍循环替换空格。因为所有的字符只需要移动一次,因此时间效率为O(n)。
代码实现如下:
public class ReplaceBlank {
/*
* 替换空格
* 输入 We Are Happy
* 输出 We20%Are20% Happy
*
*/
public static void main(String[] args) {
System.out.println(replaceBlank("We Are Happy"));
}
public static String replaceBlank(String aim){
if (aim == null) {
throw new RuntimeException("字符串为空");
}
if (!aim.contains(" ")) {
return aim;
}
char[] aimTmp = aim.toCharArray();
int num = 0; //空格数量
for (int i = 0; i < aimTmp.length; i++) {
if (aimTmp[i] == ' ') {
num++;
}
}
char[] result = new char[aimTmp.length + num * 2]; //创建新数组
int k = 0; //用k来做新数组的循环变量
for (int j = 0; j < aimTmp.length; j++) {
if (aimTmp[j] == ' ') {
result[k] = '%';
result[k+1] = '2';
result[k+2] = '0';
k += 3;
}else{
result[k] = aimTmp[j];
k++;
}
}
return Arrays.toString(result);
}
}