面试题4:替换空格
题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。
在网络编程中,如果URL参数中含有特殊字符,如空格、’#‘等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在’%‘后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成"%20"。再比如’#'的ASCII码为35,即十六进制的0x23,它在URL中被替换为"%23"。
工欲善其事必先利其器,Java在字符串方面提供非常多的API,供我们使用,极大方便了我们对字符串的操作。
不过就这道题而言,解法还是比较简单的。
解法一
新建字符串,遍历原字符串,当发现空格时,在新字符串添加%20,否则添加原字符串中的数据,不改变原数据。这个是非常传统的解法。对Java的API最直观的运用。不过在解法二中,会进行代码量上的优化(实际上是选择了更好用的API)
public String replaceSpace(StringBuffer str) {
if (str == null) {
return null;
}
StringBuffer newStr = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == (' ')) {
newStr.append('%');
newStr.append('2');
newStr.append('0');
} else {
newStr.append(str.charAt(i));
}
}
return newStr.toString();
}
解法二
遍历字符串,当发现空格时,替换空格,改变原数据
public String replaceSpace(StringBuffer str) {
if (str == null) {
return null;
}
int i = 0, j;
while (i < str.length()) {
if ((j = str.indexOf(" ")) != -1) {
str.replace(j, j + 1, "%20");
i += 2;
}
i++;
}
return str.toString();
}
如果你对String比较熟悉,看过相关的源码,建议看一下StringBuffer和StringBuilder的源码。
做工程成长最快的方式就是阅读,学习优秀的代码。
解法三
直接把StringBuffer转换成String调用replaceAll方法,改变原数据。
这部分是Java正则表达式的运用。如果你懂正则表达式,那么字符串处理方面,你将有了一个非常大的优势。
public String replaceSpace_2(StringBuffer str) {
if (str == null) {
return null;
}
return str.toString().replaceAll(" ", "%20");
}
上面这道字符串的题是非常简单的,并没有牵扯到复杂的算法。这道题就重在提醒大家,要熟练掌握Java常用的API,同时,在字符串方面,建议好好学习一下Java的正则表达式,我认为“正则表达式”的运用这项技能还是很有必要的,其次有些第三方依赖,如commons-lang3对已有的Java字符串相关的API再一次进行封装,简化我们的处理,阅读它的源码将对你很有帮助,除此之外,还有String、StringBuffer以及StringBuilder的源码级认识也是不可缺少的。
本篇文章内容虽简单,但是我想传达给你的,你Get了吗?