剑指Offer第二题:把空格变成%20
题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
题目分析
将一个字符串的空格替换成%20(JAVA源生的replace就不谈了用一个函数搞定那这个题目就没有任何意义),如果我们从前面往后面替换,那么会造成巨大的移动开销,字符串越大开销就越明显,所有从前面往后面替换显然不合理。那么我们能不能从后面到前面替换呢,答案是肯定的,而且效率还比较高。
算法描述
- 首先应该从前往后统计字符串中的空格个数
- 然后根据空格个数来扩大字符串的长度,并且记录先前的字符串尾和新的字符串尾
- 然后从后面向前逐渐替换,这样平均每个字符移动一次,效率很高
PS:我是使用的是StringBuffer而不是String,应该String的字符串赋值后不能更改,StringBuffer在赋值后可以更改,比较适合与字符串的修改,更多区别请看JAVA中String和StringBuffer的区别这篇博客
源代码
1 public class Solution { 2 public String replaceSpace(StringBuffer str) { 3 int spaceNumber=0; 4 int lenth=str.length(); 5 for(int i=0;i<lenth;i++) { 6 if(str.charAt(i)==' ') 7 spaceNumber++; 8 } 9 int newLenth=lenth+2*spaceNumber; 10 int indexOld=lenth-1; 11 int indexNew=newLenth-1; 12 13 str.setLength(newLenth); 14 15 while(indexOld>=0&&indexOld<indexNew) { 16 if(str.charAt(indexOld)==' ') { 17 str.setCharAt(indexNew--, '0'); 18 str.setCharAt(indexNew--, '2'); 19 str.setCharAt(indexNew--, '%'); 20 21 }else { 22 str.setCharAt(indexNew--, str.charAt(indexOld)); 23 } 24 indexOld--; 25 } 26 return str.toString(); 27 28 29 } 30 }
运行截图
ps:转载标明出处