面试题4-替换空格

面试题4-替换空格

基础知识

在Java和C#这样面向对象的语言中,字符串String是以对象的形式存在的,当初始化一个String对象之后,它的内容就是不能被改变的,一旦视图改变String的内容就会产生一个新的实例。对String的操作都是生成一个新的String实例并在返回值中返回。因此,如果对String做连续的修改,每一次的修改都会产生一个临时对象,这样的开销太大会影响效率。在Java中,定义了两个与字符串相关的类型:StringBuilder和StringBuffer,这两个类型的能更好的对字符串进行修改,容纳修改后的结果。
StringBuffer和StringBuilder的区别在这里说明。

题目

请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入"We are happy",则输出"We%20are%20happy"。

解题思路

首先从前往后遍历一边字符串,统计字符串中空格的数目,以此为基础统计替换之后字符串的总长度。
从后往前准备两个指针,P1和P2,同时移动P1和P2,把P1指向的字符复制到P2的位置上去,直到P1遇到空格,P1向前移动一个字符,在P2之前插入"%20",并向前移动3个字符。
重复上述过程,直到P1和P2相遇为止。
所有的字符在这个过程中都只移动一次,这个算法的复杂度为O(n)。

代码

  1. public class Solution
  2. public String replaceSpace(StringBuffer str) {//注意这里使用的StringBuffer 
  3. int len = str.length(); 
  4. if( str == null || len <=0
  5. return ""
  6. int blankNums = 0
  7. for(int i = 0; i < len; i++){ 
  8. if(str.charAt(i) == ' '
  9. blankNums ++; 

  10. if(blankNums == 0
  11. return str.toString(); 
  12. int newlength = len + blankNums * 2
  13. str.setLength(newlength); 
  14. int index1 = len - 1
  15. int index2 = newlength - 1
  16. while(index1 >= 0 && index2 > index1){ 
  17. if(str.charAt(index1) == ' '){ 
  18. str.setCharAt(index2,'0'); 
  19. index2 --; 
  20. str.setCharAt(index2, '2'); 
  21. index2 --; 
  22. str.setCharAt(index2, '%'); 
  23. index2 --; 
  24. }else
  25. str.setCharAt(index2, str.charAt(index1)); 
  26. index2 --; 

  27. index1 --; 

  28. return str.toString(); 


posted @ 2018-02-01 22:58  流泉滴沙  阅读(164)  评论(0编辑  收藏  举报