题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
public class Solution {
public String replaceSpace(StringBuffer str) {
}
}
这道题有应用场景的,因为在网络编程中,如果URL参数中含有特殊字符,如:空格、“#”等,可能导致服务器端无法获得正确的参数值。
我们需要将这些特殊符号转换成服务器识别的字符。转换规则是在“%”后面跟上ASCII码的两位十六进制的表。比如:空格的ASCII玛是32,即十六进制的0x20,因此空格被替换成“%20”。
题目很显然要求我们用 StringBuffer 类来解决问题,这道题目有两种解决方案
第一种就是调用 String 自带的方法 replaceAll
public class Solution {
public String replaceSpace(StringBuffer str) {
if(str == null){
return null;
}
return str.toString().replaceAll("\\s", "%20");
}
}
我琢磨着,面试官应该不希望看到第一种写法,想让面试者自己写一个算法,.
第二种就是调用 StringBuffer 类的方法,charAt(int index)
public String replaceSpace(StringBuffer str) {
if(str == null){
return null;
}
for(int i = 0; i < str.length(); i++)
{
if(str.charAt(i) == ' ')
{
str.replace(i, i+1, "%20");
}
}
return str.toString();
}
第三种 看别人的,利用StringBuffer实现,通过 indexOf(String str,int fromIndex) 方法和 subSequence(int start,int end) 方法联合实现
public static String replaceSpace(StringBuffer str) {
if (str == null) {
return null;
}
int fromIndex = 0;
int index = 0;
StringBuffer temp = new StringBuffer();
while (index <= str.length()) {
index = str.indexOf(" ", fromIndex);
if (index >= 0) {
temp.append(str.subSequence(fromIndex, index)).append("%20");
index = index + 1;
fromIndex = index;
} else {
temp.append(str.substring(fromIndex, str.length()));
break;
}
}
return temp.toString();
}
题外话,String 、StringBuffer、StringBuilder 之间的区别,面试题也是常有的哦。
参考文献:
https://blog.csdn.net/believejava/article/details/38682361
https://www.cnblogs.com/gl-developer/p/6435058.html