四.替换空格

第二道题

替换空格,第一次先是用split函数实现分割,然后添加“%20”,可是容易造成越界,而且“”这种情况需要特殊处理。一句话,废掉这个方法。

第二次的尝试是 从前往后 扫描一遍,遇到空格插入”%20”.代码如下:

    public String replaceSpace(StringBuffer str) {
        String temp = new String();
        temp = str.toString();
        String result = new String();
            for (int i = 0; i <str.length() ; i++) {
                if (temp.charAt(i) == ' ') {
                    result = result + "%20";
                }
                else if(temp.charAt(i)!=' ' ){
                    result = result + temp.charAt(i);
                }
            }
        return result;
    }

这个方法可以通过,可是时间复杂度不够低。
如果从后面开始插入的话,时间复杂度会降低。
1.先扫描一遍字符串,时间复杂度为O(n),得到空格的数量;
2.然后从后往前面扫描,如果符号是空格,把”%20”加入后面,如果不是空格,就把原字符加入后面
代码如下:

public static String replaceSpace(StringBuffer str) {
        String result = new String();
        int spacenum = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == ' ') {
                spacenum++;//计算空格的数量
            }
        }
        int oldindex = str.length()-1;  //当前需要检查字符的索引
        int newlength = str.length()+spacenum*2;//计算转换为空格后的str长度,spacenum*(3-1)
        //本来空格就占了一个字符位置.
        int newindex = newlength - 1;//转换后插入字符串位置的索引位置
        str.setLength(newlength);//使str长度扩大到转换后的长度,防止越界
        for (; oldindex>=0 && oldindex<newindex;--oldindex ) {//oldindex<newindex可以防止根本没有空格也要扫描一遍字符串,浪费时间.
            if (str.charAt(oldindex) == ' ') {
                str.setCharAt(newindex--, '0');
                str.setCharAt(newindex--, '2');
                str.setCharAt(newindex--, '%');
            } else {
                str.setCharAt(newindex--,str.charAt(oldindex));
            }
        }
        result = str.toString();
        return result;
    }

这里使用Stringbuffer的话,也是有理由的string类型是不可变的,每次改变对象都需要的创建一个新的对象,相对来说还是Stringbuffer比较合适。
还有一种方法代码量只有一行,只需要用封装好的方法就可以了。


public String replaceSpace(StringBuffer str) {
        return str.toString().replaceAll(" ","%20");
    }

这个方法也可以解决问题,也就是通过题目。
会有人讨论这个方法不好还是好,其实都无所谓,编程的目的就是解决问题,能满足需求并解决问题就可以,没有必要为了打代码而打代码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值