剑指offier第4题
/* 问题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()); } }