题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
方法一:使用JDK API进行替换
public class ReplaceBackspace {
public String replaceSpace(StringBuffer str) {
String string = str.toString();
String replace = string.replace(" ", "%20");
return replace;
}
}
方法二:
/*
问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换!
问题2:在当前字符串替换,怎么替换才更有效率(不考虑java里现有的replace方法)。
从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下
从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。
思路是:1.先计算出str中有多少个 空格;
2.计算出将空格替换成"%20"后,str的长度newLength
3.设置str的长度为newLength,长度会增加,新增加的长度没有值
4.对str按照原有长度从后向前遍历,将每个字母按照新的长度从后向前进行赋值,
赋值到后面之后字母所在的原位置就可以被其他符号占用,且不会影响到原有的字符。
5.遇到空格后,插入'0','2','%'
*/
public String replaceSpace(StringBuffer str){
//统计str中的space个数
int spaceNum = 0; //记录space的个数
for(int i=0;i < str.length();i++){
if(str.charAt(i) == ' '){ //判断i索引处的char字符是否是' '
spaceNum ++;
}
}
int oldLength = str.length();
int newLength = str.length()+ spaceNum*2; //%20占有三个字符才长度,所以在原有的space的基础上添加spaceNum*2
int oldIndex = oldLength-1;
int newIndex = newLength-1;
//StringBuffer newStr;
str.setLength(newLength);
//对已有的str从后向前遍历,遇到 ' '时 插入'%', '2','0'
for(;oldIndex>=0 && oldIndex < newLength;--oldIndex){
if(str.charAt(oldIndex) == ' '){
str.setCharAt(newIndex--,'0');
str.setCharAt(newIndex--, '2');
str.setCharAt(newIndex--, '%');
}else{
str.setCharAt(newIndex--, str.charAt(oldIndex));
}
}
return str.toString();
}
方法三:
public static String replaceSpace(StringBuffer str){
if(str==null)
{return "%20";}
char[] ss = str.toString().toCharArray();
StringBuffer sb = new StringBuffer();
for(int i=0;i<ss.length;i++){
if(ss[i] == ' '){
sb.append("%20");
}else{
sb.append(ss[i]);
}
}
return sb.toString();
}