Rhyme/剑指Offer Java 02

本文介绍了一种将字符串中的空格替换为%20的方法,适用于URL编码等场景。通过统计空格数量并从后向前遍历的方式,实现了字符串的有效替换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package offer2;

/**
 * 请实现一个函数,将一个字符串中的空格替换成"%20".
 * 例如,当字符串为
 * We Are Happy.
 * 则经过替换之后的字符串为
 * We%20Are%20Happy.
 * <p>
 * 思路:
 * 统计空格的个数,从后往前遍历
 * 例如:
 * <p>
 * We_Are_Happy
 * We__Are__Happy
 * <p>
 * 可以看出Are向后移动1位,Happy向后移动2位
 * <p>
 * 那可想而知
 * <p>
 * We_Are_Happy_And_You?
 * We__Are__Happy__And__You?
 * <p>
 * 可以看出Are移动1位,Happy移动2位,And移动3位,You移动4位
 *
 * @author RhymeChiang
 * @date 2018/01/14
 **/
public class Offer02 {
    /**
     * 替换的内容
     */
    public static final String REPLACE = "%20";
    public static final char BE_REPLACE = ' ';

    /**
     * 替换str中的空格为%20
     *
     * @param str
     * @return
     */
    public static String replaceSpace(String str) {

        //遍历求出字符串中的空格数量
        int spaceCount = 0;
        //将字符串str转化为char数组
        char[] chars = str.toCharArray();
        for (char c : chars) {
            if (BE_REPLACE==c) {
                spaceCount++;
            }
        }
        //创建新数组,容量大小为原数组容量加上替换字符长度-被替换字符长度
        char[] newCharArray = new char[chars.length+ spaceCount*2];
        //将原数组数据拷进新数组中
        //并在拷贝的时候调整元素位置
        int space = 0;
        for (int i = 0; i < chars.length; i++) {
            //如果遇到空格
            if(BE_REPLACE==chars[i]){
                newCharArray[i+space*2]=REPLACE.charAt(0);
                newCharArray[i+1+space*2]=REPLACE.charAt(1);
                newCharArray[i+2+space*2]=REPLACE.charAt(2);
                space++;
            }
            //遇到空格之前正常拷入
            else if(space==0){
                newCharArray[i] = chars[i];
            }
            //遇到空格了那么之后的字符串都要进行相应的平移
            //平移的位数为当前的空格数
            else{
                newCharArray[i+space*2]=chars[i];
            }
        }
        return new String(newCharArray);
    }

    public static void main(String[] args) {
        String str="We are Happy";
        System.out.println(replaceSpace(str));
    }

}

运行结果:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值