Problem 4:替换空格(字符串)

1、题目描述

请实现一个函数,将一个字符串中的每一个空格替换成“%20”。例如,当字符串为We Are Happy.则通过替换以后的字符串为We%20Are%20Happy。
注:用%20替换的缘由,空格在ASCII码中的序号为32,用十六进制表示为0x20。算法

2、思路分析

参考剑指offer上的说明,须要考虑操做是原地(in place)操做仍是新建字符串操做。以原地操做为例,首先考虑最直观的方法-从前日后依次替换。在第一个空格处,空格替换为%20,空格以后的字符所有右移三个位置。同理,第一次移动后,向后遍历,在第二个空格处继续将后边字符移动。数组

从算法角度分析,设输入规模为n,咱们须要循环遍历字符串中空格(循环中,判断是否为空的操做执行n次),在每一个空格处,进行字符移动操做,每一个字符的移动又至关于一次循环。所以,总的运行效率为app

$$ O(n^2) $$函数

直接遍历移动的方法效率过低,所以,考虑其余方法。
方法1
考虑比Sting高效的字符串操做工具-StringBuffer,一样使用以前的直接遍历的方法,可是对比发现,不须要重复移动,每次判断执行一次操做,共执行n此判断,效率为O(n)
方法2
不使用StringBuffer,参考剑指offer书上的方法,在原字符串上进行操做,利用两条指针进行数据移动的思路,具体见方法2代码。(注意倒序复制提升效率的思路)工具

3、Java实现

方法1源程序:测试

package jz_offer;

public class problem04 {
    public static String spaceReplace(String str) {
        StringBuffer newStr=new StringBuffer();
        int length=str.length();
        //特殊状况,
        if(str==null)
            return null;
        
        for(int i=0;i<length;i++) {
            if(str.charAt(i)==' ') {
                newStr.append("%20");            
            }else {
                newStr.append(str.charAt(i));
            }
        }
        return newStr.toString();
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //包含空格-:前-后-中-连续空格
        String str1 = " Wearehappy";
        String str2 = "Wearehappy ";
        String str3 = "We are happy";
        String str4 = "We   are   happy  ";
        //没有空格
        String str5="Wearehappy";
        //特殊输入测试:只有连续空格、只有一个空格、是null指针、是空字符串
        String str6="   ";
        String str7=" ";
        //String str8=null; //会出现NullPointerException(运行时异常)
        String str8="";
        
        String[] strArray=new String[] {str1,str2,str3,str4,str5,
                str6,str7,str8};
        for(int i=0;i<strArray.length;i++) {
            System.out.println(spaceReplace(strArray[i]));
        }        
    }
}

(2019/2/17 增长)注:特殊状况下原条件为str==null||length==0,后者为空字符串,输出应仍为空字符。所以后者应舍去,不然OJ会不经过(牛客测试)。spa

方法2部分程序:指针

//二、使用临时字符数组
public static String spaceReplace2(String str) {
    int length=str.length();    
    int spaceCount=0;
    for(int i=0;i<length;i++)
        if(str.charAt(i)==' ') {
            spaceCount++;
        }
    
    int newLength=length+spaceCount*2;
    char[] newStrArray=new char[newLength];
    //特殊状况
    if(str==null)
        return null;
    int j=newLength-1;
    for(int i=length-1;i>=0;i--) {
        if(str.charAt(i)==' ') {
            newStrArray[j]='0';
            newStrArray[j-1]='2';
            newStrArray[j-2]='%';
            j=j-3;
        }                
        else {
            newStrArray[j]=str.charAt(i);
            j--;
        }
    }
    return new String(newStrArray);
            
}
相关文章
相关标签/搜索