《剑指Offer》替换空格(将字符串中的空格替换为%20)

题目:

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

思路:

这种替换问题要考虑是否会覆盖原字符串,若是在源字符串上直接替换。

看到这个问题我觉得很多人都会想到直接从头开始替换,即遇到空格就将其替换为%20,每次都要将空格后的字符后移两个字节。这种解法的时间复杂度为O(n^2)!!!

另外一种较好的解法是从后往前替换,具体做法是从头遍历计算所有空格数,计算出总的长度。 该解法的前提条件是若在源字符串上替换就要求源字符串有足够的空间来容纳新的字符串。时间复杂度为O(n)!!!


public  String replaceSpace(StringBuffer str) {
        //toCharArray()函数会返回一个新的数组,
        //因此就算原数组定义了长度,返回的新数组会取代它
        char[] ch = str.toString().toCharArray();

        int spacenum = 0;  //空格数量
        for(int i =0; i<ch.length; i++){
            if(ch[i]==' '){
                spacenum++; //如果是空格,加1
            }
        }
        char[] ch1 = new char[2*spacenum + str.length()];
        int len = 2*spacenum+str.length()-1;

        for(int i=ch.length-1; i>=0; i--){
            if(ch[i] != ' '){
                ch1[len--] = ch[i];
            }else{
                ch1[len--] = '0';
                ch1[len--] = '2';
                ch1[len--] = '%';
            }
        }
        return String.valueOf(ch1);
    }
   

还有一种方法虽然很简单(调用 Java API中的 replaceAll 方法·),但是估计面试官不是想这样考你的。

public static String replaceSpace(StringBuffer str) {
        return str.toString().replaceAll("\\s", "%20");
        //\s表示空格(正则表达式)string.toString();
   

所有代码(算法+测试)详见Github/字符串空格替换成%20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值