请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.
(1) 第一种解法是重新开辟一个数组,实现相应的替换
public static int getCount(char[] arr, char src) {
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == src) {
count++;
}
}
return count;
}
public static char[] replace(char[] arr, char src, int num, char aim) {
if (arr == null) {
return null;
}
int begin = 0;
int end = arr.length - 1;
int srcCount = getCount(arr, src); // 获取需要替换目标的个数
char[] brr = new char[arr.length + srcCount * (num - 1)];
int i = 0;
int j = brr.length - 1;
while (begin <= end) { //begin end 为原数组的两头下标 i j 为新数组的两头下标
if (arr[begin] != src && begin <= end) {
brr[i] = arr[begin];
begin++; //原数组下标加一 新数组下标加一
i++;
} else {
begin++; //替换时,原数组只加一次
for (int k = 0; k < num; k++) { //新数组在循环中加
brr[i] = aim;
i++;
}
}
if (arr[end] != src && end > begin) {
if (arr[end] != src) {
brr[j] = arr[end];
end--;
j--;
} else {
end--;
for (int k = num; k > 0; k--) {
brr[j] = aim;
j--;
}
}
}
}
return brr;
}
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
//do something
String str = "i am a student!";
char[] arr = str.toCharArray();
arr = replace(arr, ' ', 2, '#');
System.out.println(Arrays.toString(arr));
long endTime = System.currentTimeMillis();
System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
}
(2) 在原数组的基础上进行扩容,通过系统的扩容函数进行扩容,这种方法在,内存消耗与上一种方法差别不大,无论是Arrays.CopyOf()方法还是System.arrayCopy()在底层对于一维数组来说都是深拷贝,这种方法的难点是将数组移位.
public class replaceBlankMove {
public static int getCount(char[] arr, int src) {
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == src) {
count++;
}
}
return count;
}
public static char[] replace(char[] arr, char src, int num, char aim) {
if (arr == null) {
return null;
}
int arrCount = arr.length - 1; //保存arr最开始的末尾值
int srcCount = getCount(arr, src);
arr = Arrays.copyOf(arr, arr.length + srcCount * (num - 1));
for (int i = 0; i < arr.length; i++) {
if (arr[i] == src) {
for (int j = arrCount; j > i; j--) { //先移位将i后面的元素移动num-1位
arr[j + num - 1] = arr[j];
}
for (int k = i; k <= i + num - 1; k++) {
arr[k] = aim;
}
arrCount += num - 1; //在此处将添加移动后的尾巴
}
}
return arr;
}
public static void main(String[] args) {
String str = "i am a student!";
char[] arr = str.toCharArray();
System.out.println(replace(arr, ' ', 2, '#'));
}
代码一次运行成功的感觉是最爽的.