剑指offer_替换空格

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

题目解析1

创建一个新的字符容器,将字符串逐个复制到新串中,如果字符是‘ ’,则用‘%20’替换,最后返回

题目方法1

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

题目解析2

/**
 * 空格替换最优解:%20
 * 思路:
 * 从后往前替换查找,首先查出来有多少个空格 count,将数组扩充到 length + 2*count ,
 * 如果是正常的字符,下标为 i ,字符在新的位置应该为j = i + 2*count ,
 * 如果是空格字符,小标为 i ,那么存放的的位置是 j=i+2*count , j=0; j-1=2; j-2=%; 
 * 同时count--,表示空格踢出去一个,往后顺延的个数也会减少2个,
 * (虽然替换的字符是%20,有3个字符,但是原本的空格占据一个字符)。
 */

题目方法2


public String replaceSpace(StringBuffer str) {

        if (null == str)
            return null;
        int n = str.length(), count = 0;//count表计空格个数
        for (int i = 0; i < n; i++)
            if (' ' == str.charAt(i))
                count++;
        int index;
        str.setLength(n + 2 * count);
        //从后往前循环这个字符串,结束条件是,没有空格了,或者遍历结束了
        for (int i = n - 1; count > 0 && i >= 0; i--) {
            index = i + 2 * count;//字符应该插入的新位置

            if (' ' == str.charAt(i)) {
                //是空格,则进行替换%20,往前三个位置都要替换
                str.setCharAt(index--, '0');
                str.setCharAt(index--, '2');
                str.setCharAt(index, '%');

                count--;//一定不要忘记,这个空格字符个数减少了,count减少后,字符顺延个数也会减少
            } else {
                //不是空格,则将原本字符的位置,往后顺延i+2*count个数,给空格字符腾位置
                str.setCharAt(index, str.charAt(i));
            }
        }
        return str.toString();
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值