很多种方式来做这种题目,特来记录一下。
public String replaceSpace(StringBuffer str){
int len = str.length();
for(int a=0;a<len;a++){
char ch = str.charAt(a);
if(ch==' '){
str = str.replace(a,a+1,"%20"); //StringBuffer和StringBuilder 中的方法 replace(int i , int j , String s)
len = len+2; // 跳过换掉的两个字符,总长度加2
a = a+2;
}
}
return str.toString();
}
正则匹配
public String replaceSpace(StringBuffer str){
return str.toString().replaceAll("\\s", "%20");
}
申请额外的StringBuilder,来依次存放替换后的字符
public String replaceSpace(StringBuffer str){
String string = str.toString();
char[] charArray = string.toCharArray();
StringBuffer sb = new StringBuffer();
for(int i = 0 ; i < charArray.length ; i ++){
if(charArray[i] == ' ') sb.append("%20");
else sb.append(charArray[i]);
}
return sb.toString();
}
剑指offer思想:首先计算好 有几个空格 :num ,双指针,p1 指向原来字符串的最后一个字符,p2 指向p1+2*num(替换好空格后的新字符串的最后一个字符),从后面移动两个指针,如果p1指向的字符是空格了,那么,这时从p2所在的位置依次设置’0’ ‘2’ ‘%’ ,每设置好一个往前移动一位,如果p1所在的位置不是空格,那么就把p1所在位置的字符转义到p2处,当p2走到了p1所在的位置时,结束。
public static String replaceSpace3(StringBuilder sb){
int num = 0 ;
for (int i = 0 ; i < sb.length() ; i++){
if (sb.charAt(i) == ' '){
num++;
}
}
int p1 = sb.length()-1;
int p2 = sb.length() -1 + num*2;
int newLength = p2+1;
sb.setLength(newLength);
for (;p1>= 0 && p1 < p2 ; p1--){
if (sb.charAt(p1) == ' '){
sb.setCharAt(p2--,'0'); // 设置完'0'p2才减一
sb.setCharAt(p2--,'2');
sb.setCharAt(p2--,'%');
}else{
sb.setCharAt(p2--,sb.charAt(p1));
}
}
return sb.toString();
}