剑指offer:替换空格 java版

来源:互联网 发布:如何看端口通不通 编辑:程序博客网 时间:2024/06/05 19:22

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


书中给出了C++版本的解答,而在java中,题目是否依然有存在的意义。每个算法我们需要考虑的都是时间和空间两个方面的优化,这个题目在C++中的解法,肯定是无需重新分配地址空间的,直接在原空间进行字符的移动即可。而在java中是否也如此呢?

首先我们必须要先了解java中封装好的可以表示字符串的三种不同的类String,StringBuffer,StringBuilder

三者的所有区别,大家可以去网上搜,在这里重点讲的就是String不同于其他二者的“不可变性”。

我们通常使用下面这种方式给String类“赋值”:String s = "We are happy"

很多人存在一个误区,以为s就是String的一个对象了,其实,s只是一个String对象的引用,并不是对象本身。引用指向了对象在内存中的地址空间,如果对引用重新赋值,则指向的地址空间发生改变,对象也随即发生了改变。

String s = "We are happy"

s = "We%20are%20happy."

而String类本身可以直接调用的一些字符串操作函数,也都是通过新建另外一个对象来实现的,所以在空间上远远是不符合题目的要求的。但基于String类本身这种不可变的性质,我们也无法对其字符所在空间进行一系列插入和移动操作,故该题目我们只能考虑StringBuffer和StringBuilder来实现,而考虑到StringBuilder是线程不安全的,所以我们用StringBuffer来实现。具体代码如下:


  1.     public String replaceSpace(StringBuffer str) {  
  2.         for(int k=0; k<str.length(); k++)  
  3.               {  
  4.               char index = str.charAt(k);  
  5.                    if(index == ' ')  
  6.                      {  
  7.                       str.replace(k, k+1"%20");  
  8.                      }  
  9.               }  
  10.            
  11.         return str.toString();  
  12.     }  






原创粉丝点击