题目描述:
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:
如果在原字符串上编辑:从前往后遍历,从前往后替换的话,需要移动多次,时间复杂度和空间复杂度太高。
剑指offer的思路是从前往后遍历,从后往前替换,插入替换时只需要移动一次。
也可直接使用java中replaceAll方法:str.toString().replaceAll(" ", "%20");
如果可以开辟新的字符串,则简单多了,直接遍历原字符串,逐个加入新的字符串中,如果有空格,新的字符串append(“%20”)即可,空间复杂度变高了
1 public class Tihuankongge { 2 public String replace(StringBuffer str){ 3 int oldlength = str.length();//原字符串长 4 int count = 0;//空格数 5 6 for(int i = 0; i < oldlength; i++){ 7 if(str.charAt(i)==‘ ‘) count++; 8 } 9 int newlength = oldlength+count*2; 10 int old = oldlength-1; 11 int index = newlength-1; 12 //System.out.println(str.length()); 13 //System.out.println(count); 14 //System.out.println(old); 15 //System.out.println(index); 16 str.setLength(newlength);//设置新的字符串长度防止越界 17 while(old >= 0 && index > old){ 18 if(str.charAt(old)==‘ ‘){ 19 str.setCharAt(index--, ‘0‘); 20 str.setCharAt(index--, ‘2‘); 21 str.setCharAt(index--, ‘%‘); 22 } 23 else { 24 str.setCharAt(index--, str.charAt(old)); 25 } 26 --old; 27 } 28 return str.toString(); 29 } 30 public static void main(String[] args) { 31 // TODO Auto-generated method stub 32 Tihuankongge tihuankongge = new Tihuankongge(); 33 StringBuffer str = new StringBuffer("We are happy."); 34 System.out.println(tihuankongge.replace(str)); 35 } 36 37 }
1 可以开辟新的字符串的情况: 2 StringBuffer stringBuffer = new StringBuffer(); 3 for(int i = 0; i < str.length();i++){ 4 if(str.charAt(i)==‘ ‘) stringBuffer.append("%20"); 5 else { 6 stringBuffer.append(str.charAt(i)); 7 } 8 } 9 return stringBuffer.toString();