[剑指Offer学习] 面试题N2:替换空格

剑指Offer:字符串中的空格替换

题目描述

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

规律发现

问题1:替换字符串,是在原来的字符串上做替换,还是开辟一个新字符串做替换;
问题2:怎么替换更有效?从前往后替换,后面的字符串要不断往后挪动,效率低下;
应该从后往前替换,首先计算替换前字符串的长度usedLength,然后通过一重循环,计算出该字符串中的空格数目whiteCount,每一个空格,替换后比替换前长度增加2,即:targetLength=2*whiteCount + usedLength。
随后,从字符串的最后一位开始,从后向前,判断,当前位置是否是空格,如果是空格,就把字符串当前位置的值赋给对应的目标位置,同时usedLength–,如果不是空格,只需要向后移动字符即可。

完整代码展示

public class N2替换空格 {
public static int replaceBlank(char [] string ,int usedLength){
        //判断输入是否合法
        if(string == null || string.length < usedLength){
            return -1;
        }

        //统计字符数组中的空白字符数目
        int whiteCount = 0;
        for(int i = 0 ; i < string.length ; i++){
            if(string[i] == ' ')
                whiteCount += 1;
        }

        //计算替换后的字符长度是多少
        int targetLength = whiteCount*2 + usedLength;
        int tmp = targetLength;
        if(targetLength > string.length) //越界处理,如果替换后的长度超过了数组长度,返回-1
            return -1;

        //没有字符串,不处理
        if(whiteCount == 0)
            return usedLength;

        usedLength--;
        targetLength--;

        //替换处理
        while(usedLength >= 0 && usedLength < targetLength){
            //如果当前字符是空格,进行%20替换
            if(string[usedLength] == ' '){
                string[targetLength--] = '0';
                string[targetLength--] = '2';
                string[targetLength--] = '%';
            }else{
                string[targetLength--] = string[usedLength];
            }
            usedLength--;
        }
        return tmp;
    }

    public static void main(String[] args){
        char[] string = new char[50];
        string[0] = 'w';
        string[1] = 'e';
        string[2] = ' ';
        string[3] = 'a';
        string[4] = 'r';
        string[5] = 'e';
        string[6] = ' ';
        string[7] = 'f';
        string[8] = 'a';
        string[9] = 'm';
        string[10] = 'i';
        string[11] = 'l';
        string[12] = 'a';
        string[13] = 'y';

        int length = replaceBlank(string,14);
        System.out.println(new String(string,0,length));
    }
}

运行结果显示

在这里插入图片描述
计划任务

  • 完成任务
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值