剑指offer,面试题04,替换空格

22 篇文章 0 订阅
4 篇文章 0 订阅

题目:请实现一个函数,把字符串中的每个空格替换成"%20",例如“We are happy.”,则输出“We%20are%20happy.”

最原始的思路是直接对字符串进行顺序扫描,然后再找到空格的地方,进行替换并移动之后的字符,但是这样的话时间复杂度就是O(n2)。

书上提供的一种思路是,先计算需要替换的有多少处,这样就能得到新建的char数组的大小了,然后,在老的char数组和新的char数组,都从后向前扫描,没有空格的地方直接复制到新的char数组中,有空格的地方,新的char数组,填入需要替换的字符串,这样一直扫描到两个数组的开头。这样就只进行了一次循环,时间复杂度是O(n)。

我在代码中使用replace方法实现了。

不过后来自己想了,因为在计算有多少处需要替换的时候,本身就是一次扫描,那么我可以记录下不需要替换和需要替换的字符串,然后将它加入一个String型的ArrayList的,利用Arraylist是顺序的和可以扩展的来实现这个目的,在程序中使用的是newRepalce这个方法,测试中用的是"%21"来替换空格。

下面是实现的代码:

package partOne;

import java.util.ArrayList;

public class ReplaceString {
    private String replace(String oldString , String replaceString){
        char[] oldCharArray = oldString.toCharArray();
        char[] replaceCharArray = replaceString.toCharArray();

        int length = oldCharArray.length;
        int count = 0;

        //计算需要替换的空位数目
        for(int i=0;i<length;i++){
            if(oldCharArray[i]==' '){
                count++;
            }
        }

        //新数组长度
        int newLength = length+(3-1)*count;

        char[] newCharArray = new char[newLength];

        int oldPos = length-1;
        int newPos = newLength-1;
        //两个标识都从最后面开始向前面移动,直到到达最前方
        while(oldPos>=0&&newPos>=0){
            if(oldCharArray[oldPos]!=' ') //非空格的地方直接复制
            {
                newCharArray[newPos] = oldCharArray[oldPos];
                newPos--;
                oldPos--;
            }
            else{ //空格的地方采用替代方式复制
                newCharArray[newPos] = '0';
                newCharArray[newPos-1] = '2';
                newCharArray[newPos-2] ='%';
                newPos = newPos-3;
                oldPos--;
            }
        }

        String newString = String.valueOf(newCharArray);
        System.out.println("new String is:"+newString);
        return newString;
    }

    private String newReplace(String oldString,String ReplaceString){
        //创建存储各部分的ArrayList
        ArrayList<String> saveArrayList = new ArrayList<>();
        char[] oldCharArray = oldString.toCharArray();
        int length = oldCharArray.length;
        String tempString = "";

        //将原String分开存储入ArrayList
        for(int i=0;i<length;i++){
            if(oldCharArray[i]!=' '){
                tempString = tempString+String.valueOf(oldCharArray[i]);
                if(i==length-1){
                    saveArrayList.add(tempString);
                }
            }
            if(oldCharArray[i]==' '){
                if(tempString!=""){
                    saveArrayList.add(tempString);
                    tempString="";
                }
                saveArrayList.add(ReplaceString);
            }
        }

        String newString ="";
        for(String stringValue:saveArrayList){
            newString=newString+stringValue;
        }
        System.out.println("new String is:"+newString);
        return newString;


    }

    public static void main(String[] args) {
        String testString = "WE ARE HAPPY";
        String newString = new ReplaceString().replace(testString,"%20");

        new ReplaceString().newReplace(testString,"%21");


    }
}

测试结果:

 

代码github地址:代码地址 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值