题目
请实现一个函数,把字符串中的每个空格替换成“%20”例如输入“We are happy.”则输出“We%20are&20happy.”
说明
要实现这个函数,对于java来说非常容易。java JDK中集成的String类可以对字符串进行多种操作,例如长度的获取、字符串的截取、字符串的替换等方法。而此题目要求的把字符串中的每个空格替换成“%20”就可以通过String类实现,没有时间复杂度的考虑。
String类的使用
public String replaceBlank(String string){
if(string==null||string.length()<=0){
return null;
}
String ss = string.replaceAll(" ", "%20");
return ss;
}
Java数组的实现
采用String类实现显然体现不了算法的高效,而使用字符数组来模拟字符串时,发现java中的数组是有长度的,而不同于c语言这种不定长度存储的语言,使用结束符来动态改变数组的大小,显然可以通过控制结束符的位置来定数组的大小,进而使用算法节省内存。而java数组只能通过空间换取时间来实现,而算法的优越性体现不出来(这里主要的算法思想是从后向前复制,避免了从前向后复制带来的移动开销)先看一下代码
public static char[] replaceBlank(char[] string) {
if (string == null || string.length <= 0) {
return null;
}
int orginalLength = string.length;
int blankCount = 0;
for (int i = 0; i < orginalLength; i++) {
if (string[i] == ' ') {
blankCount++;
}
}
int newLength = orginalLength + blankCount * 2;
char[] newString = new char[newLength];
// 从前向后复制
int i = 0;
int j = 0;
while (i < orginalLength && j < newLength) {
if (string[i] == ' ') {
newString[j++] = '%';
newString[j++] = '2';
newString[j++] = '0';
} else {
newString[j++] = string[i];
}
i++;
}
//从后往前复制
/*
int i = orginalLength;
int j = newLength;
while (i >= 0 && j > i) {
if (string[i] == ' ') {
newString[j--] = '%';
newString[j--] = '2';
newString[j--] = '0';
} else {
newString[j--] = string[i];
}
i--;
}*/
return newString;
}
少年不知愁滋味,为赋新词强说愁。没有必要为了C语言中的不定数组,在java中实现一种类似的算法,理解算法万岁。