前言
算法打卡,替换空格,第一印象可以使用
s.replaceAll(" ","%20")
,可以向面试官展示你熟练的API操作,但是这样做对你的印象会打打折扣。
一、StringBuilder
1、想法
通过循环遍历的方式,取所有的字符来和空格字符比较,如该位置的字符为空格,则添加“%20”进入stringbuilder,反之,把原来的字符append到stringbuilder。
1)StringBuilder
StringBuffer为了保证线程安全,在StringBuilder的基础上使用了Synchronized锁,而这里的单线程不需要考虑线程安全,这样就加快了处理速度。
2)三目运算符
CPU执行指令存在高速缓存中,有一个指令队列,当使用if…else代码时,先把if中的指令加入队列,而当if不成立时,队列清空,加入else的代码(指令)。但对于三目运算符,则使用把两种可能都加入队列的机制,CPU会执行全部指令,然后根据最后运算出的条件来选择需要的结果。这看起来虽然CPU运算的指令变多,但是减少了等待时间,CPU最擅长的就是计算。
2、源码
public String replaceSpace(String s) {
//单线程,不用stringbuffer来同步
StringBuilder result = new StringBuilder();
for(int i = 0;i < s.length();i++)
result.append(" ".equals(s.substring(i,i+1))?"%20":s.substring(i,i+1));
return result.toString();
}
二、采用数组
用字符数组存作为cache,根据条件缓存该存的字符。最后生成string。
1、源码
public String replaceSpace(String s) {
int len = s.length();
char[] cache = new char[len * 3];
int size = 0;
for(int i = 0;i < len;i++){
if(s.charAt(i) == ' '){
cache[size++] = '%';
cache[size++] = '2';
cache[size++] = '0';
}else{
cache[size++] = s.charAt(i);
}
}
String result = new String(cache,0,size);
return result;
}