剑指offer Java代码实现-05题

题目描述

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

思路分析

**1.首先应该考虑的是在原来的字符串上面直接替换还是新开辟一段空间替换
2.然后考虑的是如果直接在原来的字符串上面替换怎么替换更有效率
	①如果从前往后进行替换则后面的字符大多数字符都需要进行移动
    ②从后往前进行替换,如果知道一共有x空格则第一次需要挪动后面较少元素x个单位然后每次挪动完成x--,
     每个元素就只需要一次挪动就能完成任务**
package com.senchen365.java;

import java.util.Scanner;


/**
 * 类名:TwoArraySearch<br>
 * 作者:java菜鸟<br>
 * 功能:实现替换空格函数<br>
 * 时间:20:39<br>
 * 版本:1.0.0<br>
 */
public class ReplaceSpace_05 {
    /*
        题目描述
            请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.
            则经过替换之后的字符串为We%20Are%20Happy。
     */

    //1.首先应该考虑的是在原来的字符串上面直接替换还是新开辟一段空间替换
    //2.然后考虑的是如果直接在原来的字符串上面替换怎么替换更有效率
        //①如果从前往后进行替换则后面的字符大多数字符都需要进行移动
        //②从后往前进行替换,如果知道一共有x空格则第一次需要挪动后面较少元素x个单位然后每次挪动完成x--,
        // 每个元素就只需要一次挪动就能完成任务

    public static void main(String[] args){
        System.out.println("请输入一段带空格的字符串例如:We Are Happy");
        Scanner scanner=new Scanner(System.in);

        //这块需要注意用scanner的nextLine()方法来读入字符串否则只能读入输入的字符串的第一个空格之前的数据
        // 比如 We Are Happy 用next()只能读入 We

        String word =  scanner.nextLine();
        if (word.trim().equals("")){//检验用户输入的字符串是不是只包含空格
            System.out.println("不能全部输入空格");
            return;
        }
        //对字符串进行替换采用StringBuilder效率会更高
        StringBuilder sb = new StringBuilder(word);
        int x=0;
        for (int i = 0; i < sb.length(); i++) {
            if(sb.charAt(i)==' '){
                x++;
            }
        }
        myReplace(sb,x);
        System.out.println(sb);
    }

    /**
     * 实现字符串20%替换空格的函数
     * @param sb 包装成StringBuilder类型的字符串
     * @param count 总的空格数
     * @return 替换后的字符串
     */
    private static void myReplace(StringBuilder sb,int count) {
        //因为原来空格只有一个字符而现在替换后的20% 共有三个字符 '2','0','%'
        int preLength = sb.length();
        int preIdx = preLength - 1;
        int newLength = preLength + count * 2;
        int newIdx = newLength - 1;
        //设置新的长度字符串长度
        sb.setLength(newLength);

        while (preIdx >= 0){
            if (sb.charAt(preIdx) != ' '){
                sb.setCharAt(newIdx,sb.charAt(preIdx));
                preIdx--; newIdx--;
            }else {
                sb.setCharAt(newIdx--,'%');
                sb.setCharAt(newIdx--,'0');
                sb.setCharAt(newIdx--,'2');
                preIdx--;
            }
        }
    }

}

值得注意的是要防止用户输入的全部是空格没有其他字符的一个字符串需要检测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值