剑指offer_编程题_替换字符串

题目描述

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

分析

这个题看起来是很容易做的,就是简单的替换.但当你仔细分析后,就会有一个问题出现,当字符串特别长的时候,应该怎样优化自己的算法呢 ?
一般常规的做法是:从前向后遍历字符串,当遇到空格时,把空格用"%20",但是空格后面的字符都要向后移动一位(因为%20比空格长),后面的每个替换操作都需要后面的字符向后移动.这样算法的复杂度就大大增加了.
换一种思路,当你从字符串的最后遍历-替换的话,是不是就没有这个问题了呢?
答案是肯定的,但是需要你提前计算好替换后的字符串的长度,不然就会出现字符串长度溢出(这里默认的是定长的字符类型String,.我下面的代码里面用的是可变的Stringbuffer).从后向前的操作和从前向后的操作一样,只是遍历的方向不同而已,下面看下具体代码实现吧!

源代码 (用java类库函数)

/**
 * 请实现一个函数,将一个字符串中的每个空格替换成“%20”。
 * 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
 */
public class Dome4 {
    public static void main(String[]args){
        Dome4 dome4=new Dome4();
        StringBuffer buffer=new StringBuffer("we are happy");
        System.out.println(dome4.replaceSpace(buffer));

    }

    /**
     *
     *
     * @param str 替换前的字符串
     * @return  替换后的字符串
     */
    public String replaceSpace(StringBuffer str) {
        for(int i=str.length()-1;i>=0;i--){
            if(Character.isSpaceChar(str.charAt(i))){//判断空格位置
                str.replace(i,i+1,"%20");    //替换空格
            }
        }
        String result= String.valueOf(str);
        return result;
    }
}

不用类库

public class Dome4_1 {
    public static void main(String[]args){
        replaceSpace();
    }
    public static  void replaceSpace(){
        String str="we are happy";
        char []ch=str.toCharArray();
        int newLen=ch.length+2*2;//指向修改后数组末尾
        int b=ch.length-1;//原始字符串的长度
        char []newCh=new char[newLen+1];
        while (b>=0&&newLen>=b){
            if(Character.isSpaceChar(ch[b])){
                newCh[newLen--]='0';
                newCh[newLen--]='2';
                newCh[newLen--]='%';
            }else{
                if(newLen==ch.length+2*2){//为了防止数组溢出
                    --newLen;
                }
                newCh[newLen--]=ch[b];
            }
            b--;
        }
        for(int i=0;i<newCh.length-1;i++){
            System.out.print(newCh[i]);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值