题目:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解答:
①常规方法
从后往前,先计算需要多少空间,然后从后往前移动,碰到空格,每个向后移动两个格,最后将%20插入。
public class Solution {
public String replaceSpace(StringBuffer str) {
int spacenum=0;//spacenum为计算空格数
for(int i=0;i<str.length();i++){
if(str.charAt(i)==' '){
spacenum++;
}
}
int oldindex=str.length()-1;//indexold为为替换前的str下标
int newlength=str.length()+spacenum*2;//计算空格转换成%20之后的str长度
str.setLength(newlength);//使str的长度扩大到转换成%20之后的长度,防止下标越界
int newindex=str.length()-1;//indexnew为为把空格替换为%20后的str下标
for(int i=oldindex;i>=0;i--){
if(str.charAt(i)==' '){
for(int j=newindex;j>i+1;j--){
str.setCharAt(j,str.charAt(j-2));
}
str.setCharAt(i+2,'0');
str.setCharAt(i+1,'2');
str.setCharAt(i,'%');
}
}
return str.toString();
}
}
运行时间: 23 ms
占用内存:9548K
②改进常规方法
已经计算了扩大后的空间,只需移动一次就可以,一层循环就好。从后往前,循环里只需要遍历一次即可。
public class Solution {
public String replaceSpace(StringBuffer str) {
int spacenum=0;//spacenum为计算空格数
for(int i=0;i<str.length();i++){
if(str.charAt(i)==' '){
spacenum++;
}
}
int oldindex=str.length()-1;//indexold为为替换前的str下标
int newlength=str.length()+spacenum*2;//计算空格转换成%20之后的str长度
str.setLength(newlength);//使str的长度扩大到转换成%20之后的长度,防止下标越界
int newindex=str.length()-1;//indexnew为为把空格替换为%20后的str下标
for(int i=oldindex;i>=0;i--){
if(str.charAt(i)==' '){
str.setCharAt(newindex--,'0');
str.setCharAt(newindex--,'2');
str.setCharAt(newindex--,'%');
}else{
str.setCharAt(newindex--,str.charAt(i));
}
}
return str.toString();
}
}
运行时间:14ms
占用内存:9552k
③利用StringBuffer/StringBuilder的append拼接函数
public class Solution {
public String replaceSpace(StringBuffer str) {
if(str==null) return null;
StringBuilder sb=new StringBuilder();
for(int i=0;i<str.length();i++){
if(String.valueOf(str.charAt(i)).equals(" ")){//String.valueOf()将字符转换成字符串
sb.append("%20");
}else{
sb.append(str.charAt(i));
}
}
return String.valueOf(sb);
}
}
运行时间:20ms
占用内存:9480k