方法一、用java自带方法
运行时间:27ms 占用内存:9548k
public static String replaceSpace(StringBuffer str) {
// 方法一、偷懒解法:用java自带库
return str.toString().replace(" ", "%20");
}
方法二、新定义一个StringBuffer,碰到空格就替换后追加。
运行时间:28ms 占用内存:9512k
public static String replaceSpace2(StringBuffer str) {
// 方法二、新定义一个数组,碰到空格就追加符号,否则就追加原字母本身。
StringBuffer sBuffer = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c == ' ') {
sBuffer.append("%20");
} else {
sBuffer.append(c);
}
}
return sBuffer.toString();
}
方法三:最传统最面向过程的方法。
运行时间:18ms 占用内存:9548k
注意的细节:1.新开辟的空间,应该是原字符串长度加上二倍的空格个数。
2.String类型不能改变内容,所以不能作为结果的中转存储。因为不能逐位更改字符。所以要用个StringBuffer先做逐位替换,最后再转为String。(也可以不新定义字符串,直接用原字符串)
3.虽然StringBuffer可变长,但是要用下标取数时,还是需要提前将长度扩充。
public static String replaceSpace3(StringBuffer str) {
//方法三、最面向过程的方法。不依赖java现有的方法。真正的替换。
//从前向后统计空格个数,从后往前替换。
int lenOld = str.length();
int countSpace = 0;
//注意:需要开辟的空间是原字符串长度加上二倍的空格长度。因为虽然替换是三个字符,
//但原字符串上还有个空格的位置
for (int i = 0; i < str.length(); i++) {
if(str.charAt(i) == ' ') {
countSpace++;
}
}
//不能用String中转结果,因为String不可变。可新定义一个StringBuffer或者用本来的StringBuffer。
int lenNew = lenOld + countSpace*2;
str.setLength(lenNew); //这里如果没有重新设置长度会报错。
for(int indexNew = lenNew -1, indexOld = lenOld-1; indexNew>indexOld && indexOld >=0; indexOld-- ) {
char c = str.charAt(indexOld);
if(c != ' ') {
str.setCharAt(indexNew, c);
indexNew--;
}
else {
str.setCharAt(indexNew--, '0');
str.setCharAt(indexNew--, '2');
str.setCharAt(indexNew--, '%');
}
}
return str.toString();
}