第二道题
替换空格,第一次先是用split函数实现分割,然后添加“%20”,可是容易造成越界,而且“”这种情况需要特殊处理。一句话,废掉这个方法。
第二次的尝试是 从前往后 扫描一遍,遇到空格插入”%20”.代码如下:
public String replaceSpace(StringBuffer str) {
String temp = new String();
temp = str.toString();
String result = new String();
for (int i = 0; i <str.length() ; i++) {
if (temp.charAt(i) == ' ') {
result = result + "%20";
}
else if(temp.charAt(i)!=' ' ){
result = result + temp.charAt(i);
}
}
return result;
}
这个方法可以通过,可是时间复杂度不够低。
如果从后面开始插入的话,时间复杂度会降低。
1.先扫描一遍字符串,时间复杂度为O(n),得到空格的数量;
2.然后从后往前面扫描,如果符号是空格,把”%20”加入后面,如果不是空格,就把原字符加入后面
代码如下:
public static String replaceSpace(StringBuffer str) {
String result = new String();
int spacenum = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == ' ') {
spacenum++;//计算空格的数量
}
}
int oldindex = str.length()-1; //当前需要检查字符的索引
int newlength = str.length()+spacenum*2;//计算转换为空格后的str长度,spacenum*(3-1)
//本来空格就占了一个字符位置.
int newindex = newlength - 1;//转换后插入字符串位置的索引位置
str.setLength(newlength);//使str长度扩大到转换后的长度,防止越界
for (; oldindex>=0 && oldindex<newindex;--oldindex ) {//oldindex<newindex可以防止根本没有空格也要扫描一遍字符串,浪费时间.
if (str.charAt(oldindex) == ' ') {
str.setCharAt(newindex--, '0');
str.setCharAt(newindex--, '2');
str.setCharAt(newindex--, '%');
} else {
str.setCharAt(newindex--,str.charAt(oldindex));
}
}
result = str.toString();
return result;
}
这里使用Stringbuffer的话,也是有理由的string类型是不可变的,每次改变对象都需要的创建一个新的对象,相对来说还是Stringbuffer比较合适。
还有一种方法代码量只有一行,只需要用封装好的方法就可以了。
public String replaceSpace(StringBuffer str) {
return str.toString().replaceAll(" ","%20");
}
这个方法也可以解决问题,也就是通过题目。
会有人讨论这个方法不好还是好,其实都无所谓,编程的目的就是解决问题,能满足需求并解决问题就可以,没有必要为了打代码而打代码。