剑指offer:替换空格 java版

题目:请实现一个函数,把字符串中的每个空格替换成“%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.     }  






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值