剑指offer(二)替换字符

  • 题目展示
    请实现一个函数,将一个字符串中的空格替换成“%20”。
  • 案例:
    当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.
  • 思考题目
    • 第一想法,直接用字符串的replace方法替换,即str.toString().replace(” “, “%20”);
    • 然后拿去验证,发现竟然验证通过了。
    • 本着精益求精的思想,想着可能人家想让我们自己实现replace的方法,而不是让自己直接去调用
    • 然后继续寻找第二种方式
  • 分析题目
    • stringbuffer底层是char数组,那是不是可以遍历,然后记录下空格的index,再一个个去替换
  • 解题代码(一)
    /**
     * 剑指offer(替换空格)
     * @param str
     * @return
     */
    public static String replaceSpace(StringBuffer str) {

        List<Integer> list = new ArrayList<Integer>();
        //遍历字符,记录下空格的下标
        for( int i = 0; i < str.length(); i++ )
        {
            if( str.charAt(i) == ' ')
                list.add(i);
        }
        Collections.reverse(list);//将顺序反过来,因为空格替换为%20时会将后面的字符下标增加2
        //遍历替换
        for( Integer index : list ) 
        {
            str.replace(index, index + 1, "%20");
        }
        return str.toString();
    }

我写出来发现,这里还是用到了stringbuffer的replace,和之前那个没什么本质区别。
那就接着寻找,代码更精细化。

  • 解题代码(二)
    /**
     * 剑指offer(替换空格)
     * @param str
     * @return
     */
    public String replaceSpace(StringBuffer str) {

        char[] charArray = str.toString().toCharArray();//转换为字符串然后转化为字符数组
        StringBuilder sBuilder = new StringBuilder();
        //遍历字符数组
        for (char c : charArray) 
        {
            if(c == ' ') 
            {
                sBuilder.append("%20");    
            } else 
            {
                sBuilder.append(c);
            }
        }
        return sBuilder.toString();
    }
  • 解题代码(三)
    /**
     * 剑指offer(替换空格)
     * @param str
     * @return
     */
    public static String replaceSpace(StringBuffer str) {

        int count = 0;//空格个数
        for( int i = 0; i < str.length(); i++ )
        {
            if( str.charAt(i) == ' ')
                count++;
        }

        //如果没有空格则直接返回
        if( count == 0 )
            return str.toString();

        int len = str.length();//字符总长度
        int newLen = 2 * count + len;//替换之后的总长度
        int index = newLen - 1;//最后一位下标

        char singleChar;//存放每一个取出来的字符
        char[] ptr = new char[newLen];//创建新的char数组,用于存放新的字符

        while( len > 0 ) {
            singleChar = str.charAt(len - 1);//
            if( singleChar != ' ' ) 
            {
                ptr[index--] = singleChar;
            } else 
            {
                ptr[index--] = '0';
                ptr[index--] = '2';
                ptr[index--] = '%';
            }
            --len;
        }
        return new String(ptr);
    }

第三种方式思路参考自wanganyu1996的博客
- 总结:
- 虽然三种方法都能实现该操作,但是很显然,第三种才是最原始的方法,用纯粹的基础数据类型来完成。
- 用封装好的方法固然快捷和方便,但是用最原始的方式,可以让我们更加熟悉底层知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值