这个不难,只需要一些语言知识即可。主要针对过程中出现的问题一些记录一下。
题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
1. 使用replace:
public String replaceSpace(StringBuffer str) {
String str2 = str.toString();
//str2.replace(" ", "%20");
str2 = str2.replace(" ", "%20");
return str2;
}
其实只需要一句return str.toString.replace(" ","%20")就可以解决了~
注意replace方法需要返回一个字符串,而不是直接在当前字符串上改变,开始忘记了,直接用的注释那句,怎么返回都不对……,想了半天。
2. split方法:(错误示范)
public String replaceSpace(StringBuffer str) {
String str2 = str.toString();
String[] st = str2.split(" ");
//是否以" "开头
boolean first = str.indexOf(" ") == 0 ? true : false;
//是否以" "结尾
boolean last = str.lastIndexOf(" ") == str.length() - 1 ? true : false;
str.setLength(0);
if (first) {
str.append("%20");
}
for (int i = 0; i < st.length; i++) {
str.append(st[i]);
if (i < st.length - 1) {
str.append("%20");
}
}
if (last) {
str.append("%20");
}
return str.toString();
}
开始想用split方法,以" "分割,但实践了一下,发现存在很多问题:
1)当头部为一个空格时,st[0]为空字符""
2)当头部连续空格时,有几个空格,数组前面几位就是""
3)当中间出现一个空格时,如:"hello worle",正常分割为:hello,world,没有空字符
4)当中间出现多个连续空格时,如:"hello worle"(中间3个空格),数组中为:hello,"","",world,2个空字符
5)尾部出现字符时,如果使用的是split(String regex),则尾部空格忽略,无空字符,如果使用的是split(String regex,str.length()),则尾部字符也会出现....同样也是有几个空格就追加几个空字符
6)综上,这逻辑真的好难啊,感觉在遍历的时候还需要判断一下上一个元素以及下一个元素是不是空字符来决定要不要加%20,总是我已经炸毛了,遂放弃。
3. 使用getChars方法转为数组遍历
public String replaceSpace(StringBuffer str) {
int len = str.length();
char[] st = new char[len];
str.getChars(0, len , st, 0);
str.setLength(0);
for (int i = 0; i < len; i++) {
if (st[i] == ' ') {
str.append("%20");
} else {
str.append(st[i]);
}
}
return str.toString();
}
这里的问题是getChars的参数
getChars(int srcBegin, int srcEnd, char[] dst,int dstBegin):
截取的是srcBegin到srcEnd-1之间的String,所以是0到str.length,如果当作索引的话会导致最后少一位。
4. AtChar+replace,这个是别人的方法,测试出来的效率也是最快的,只需要查询并修改一部分即可。果然最好的方法还是别人先出来的😂,我在查API的时候看到了AtChar方法都没想到要这么用..
public String replaceSpace(StringBuffer str) {
int n = str.length();
for (int i = 0; i < n; i++) {
if (str.charAt(i) == ' ') {
n += 2;
str.replace(i, i + 1, "%20");
}
}
return str.toString();
}
这里面n += 2是为了让遍历的时候i < n不出错~