/* 问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换! 问题2:在当前字符串替换,怎么替换才更有效率(不考虑java里现有的replace方法)。 从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下 从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。 */ 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 indexold = str.length()-1; //indexold为为替换前的str下标 int newlength = str.length() + spacenum*2;//计算空格转换成%20之后的str长度 int indexnew = newlength-1;//indexold为为把空格替换为%20后的str下标 str.setLength(newlength);//使str的长度扩大到转换成%20之后的长度,防止下标越界 for(;indexold>=0 && indexold<newlength;--indexold){ if(str.charAt(indexold) == ' '){ // str.setCharAt(indexnew--, '0'); str.setCharAt(indexnew--, '2'); str.setCharAt(indexnew--, '%'); }else{ str.setCharAt(indexnew--, str.charAt(indexold)); } } return str.toString(); } }
package 剑指office; /* * 第四题替换空格 * 请实现一个函数,将一个字符串中的空格替换成“%20”。例如, * 当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 */ public class ReplaceBlank { public String replaceSpace(StringBuffer str) { return str.toString().replaceAll("\s", "%20"); } public String replaceSpace1(StringBuffer str) { StringBuffer out=new StringBuffer(); for (int i = 0; i < str.toString().length(); i++) { char b=str.charAt(i); if(String.valueOf(b).equals(" ")){ out.append("%20"); }else{ out.append(b); } } return out.toString(); } public String replaceSpace2(StringBuffer str) { char[] ch = str.toString().toCharArray(); int spacenum = 0; for(int i =0; i<ch.length; i++){ if(ch[i]==' '){ spacenum++; } } char[] ch1 = new char[2*spacenum + str.length()]; int len = 2*spacenum+str.length()-1; for(int i=ch.length-1; i>=0; i--){ if(ch[i] != ' '){ ch1[len--] = ch[i]; }else{ ch1[len--] = '0'; ch1[len--] = '2'; ch1[len--] = '%'; } } return String.valueOf(ch1); } public String replaceSpace4(StringBuffer str) { int spacenum = 0;//spacenum为计算空格数 for(int i=0;i<str.length();i++){ if(str.charAt(i)==' ') spacenum++; } int indexold = str.length()-1; //indexold为为替换前的str下标 int newlength = str.length() + spacenum*2;//计算空格转换成%20之后的str长度 int indexnew = newlength-1;//indexold为为把空格替换为%20后的str下标 str.setLength(newlength);//使str的长度扩大到转换成%20之后的长度,防止下标越界 for(;indexold>=0 && indexold<newlength;--indexold){ if(str.charAt(indexold) == ' '){ // str.setCharAt(indexnew--, '0'); str.setCharAt(indexnew--, '2'); str.setCharAt(indexnew--, '%'); }else{ str.setCharAt(indexnew--, str.charAt(indexold)); } } return str.toString(); } public static void main(String[] args) { StringBuffer str = new StringBuffer(); str.append("We are happy"); System.out.println(new ReplaceBlank().replaceSpace4(str)); System.out.println(str.toString()); } }
这个方法和上一个用for循环的都比较好,没有额外开辟空间,没有改变原来的str
package 剑指office;
/*
* 第四题替换空格
* 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,
* 当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
*/
public class ReplaceBlankDemo {
public String replaceSpace(StringBuffer str){
int spaceNum =0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)==' '){
spaceNum++;
}
}
int indexOld = str.length()-1;
int indexNew = indexOld+2*spaceNum;
str.setLength(indexNew+1);
while (indexOld>=0) {
if(str.charAt(indexOld)==' '){
str.setCharAt(indexNew--, '0');
str.setCharAt(indexNew--, '2');
str.setCharAt(indexNew--, '%');
}else{
str.setCharAt(indexNew--, str.charAt(indexOld));
}
indexOld--;
}
return str.toString();
}
public static void main(String[] args) {
StringBuffer str = new StringBuffer();
str.append("We are happy");
System.out.println(new ReplaceBlankDemo().replaceSpace(str));
System.out.println(str.toString());
}
}