每天一道算法題——替換空格

題目描述
請實現一個函數,將一個字符串中的空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。、
解題思路
1.利用API中的方法:

public class Test1 {
    public String replaceSpace(StringBuffer str) {
        return str.toString().replaceAll(" ", "%20");
    }
}

當然這樣是不行的。
2.簡單的遍歷:

public class Test1 {
    public String replaceSpace(StringBuffer str) {  
        String str1 = str.toString();
        StringBuffer stb = new StringBuffer();
        for(int i=0;i<str.length();i++){
            if(str1.charAt(i)==' '){
                stb.append("%20");
            }else{
                stb.append(str1.charAt(i));
            }
        }
        return stb.toString();
    }
}

3.針對替換的效率做了優化
從前往後替換,後面的字符要不斷往後移動,要多次移動,所以效率低下
從後往前,先計算需要多少空間,然後從後往前移動,則每個字符只爲移動一次,這樣效率更高一點

public class Test1{
    public String replaceSpace(StringBuffer str) {
        int sNum = 0;//空格數計數器
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == ' ') {
                sNum++;
            }
        }
        int oldIndex = str.length() - 1;//替換前的str下標
        int newLength = sNum * 2 + str.length();//計算空格轉換後的長度
        int newIndex = newLength - 1;//空格替換爲%20後的下標
        str.setLength(newLength);//防止下標越界,將str的長度擴大到轉換後的長度
        for (; oldIndex >= 0 && newIndex > oldIndex; oldIndex--) {
            if (str.charAt(oldIndex) == ' ') {
                str.setCharAt(newIndex--, '0');
                str.setCharAt(newIndex--, '2');
                str.setCharAt(newIndex--, '%');
            } else {
                str.setCharAt(newIndex--, str.charAt(oldIndex));
            }
        }
        return str.toString();

    }
}

在C++中需要注意每個字符串後面有“\0”,對字符串的長度需要注意下,是和Java不同的。

測試結果:
1.22ms
2.18ms
3.19ms
第一種可能是因爲調用API方法耗費了更多的時間,但是我不知道爲什麼優化的方法會更慢一點,可能是循環的問題?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章