剑指Offer——面试题5替换空格

Note: 剑指offer的题可以在牛客网上做题验证思路的正确性

依赖StringBuffer的replace实现,时间复杂度O(n),空间复杂度较高

思路:因为StringBuffer本身是可变字符串序列,可以修改,实际上它的可变是牺牲空间换取的。替换可能导致超出其容量,char数组的复制和新建。

public String replaceSpace(StringBuffer str) {
        // 判断是否为空
        if(str == null){
            return null;
        }

        String originalStr = str.toString();
        String replacedStr = "%20";
        int increaseLen = 2;
        int spaceCount = 0;
        int strLen = originalStr.length();
        int index = 0;
        while(index < spaceCount*increaseLen + strLen){
            if(str.charAt(index) == ' '){
                str.replace(index, index+1, replacedStr);
                spaceCount++;
                index += 3;
            }else{
                index++;
            }
        }
        return str.toString();
    }

如果进一步缩小空间复杂度

思路:先统计空格数,得到新字符串长度,再复制和替换,避免空间的浪费

public String replaceSpace(StringBuffer str) {
        // 判断是否为空
        if(str == null){
            return null;
        }

        String originalStr = str.toString();
        int increaseLen = 2;
        int spaceCount = 0;
        int strLen = originalStr.length();
        // 统计空格数量
        for(int i = 0; i < strLen; i++){
            if(str.charAt(i) == ' '){
                spaceCount++;
            }
        }

        // 替换
        int newStrLen = spaceCount*increaseLen + strLen;
        char[] newCharSeq = new char[newStrLen];
        spaceCount = 0;
        for(int i = 0; i < newStrLen; ){
            int oindex = i-spaceCount*2; //原位置
            if(str.charAt(oindex) == ' '){
                newCharSeq[i++] = '%';
                newCharSeq[i++] = '2';
                newCharSeq[i++] = '0';
                spaceCount++;
            }else{
                newCharSeq[i] = str.charAt(oindex);
                i++;
            }
        }

        return new String(newCharSeq);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值