1. 程式人生 > >【劍指offor】2、替換空格

【劍指offor】2、替換空格

題目連結:
替換空格

題目描述

請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。

注意:C++解法中,給定的字串結尾後面還有一定的空間,不然我們還得重新給它分配足夠的記憶體空間才能將空格換成%20。在寫題過程中,我們需要判斷替換後的字串是否會超過給定的記憶體空間長度,超過了就直接返回。Java解法需要自己重新分配記憶體空間。

解題思路

O(n2)的思路就不寫了,直接就是從前開始遍歷,遇到空格就將後面所有剩餘的字串往後移動兩個位置,然後前面的空格後面就多了兩個空位置,寫上%20即可。

O(n)的解法:
這種題型,要很容易想到從後往前掃描字串。我們可以這樣:先計算出該字串有幾個空格,然後算出替換後的字串一共需要多少空間的長度。我們從字串的後面開始準備複製和替換。可以看以下圖示過程:

其中,p2是指向替換後字串的結尾處應該在哪裡,p1是指向替換前,字串的結尾處。

我們從字串的後面開始複製和替換,當p1指向的是字元,則將字元複製給p2位置。同時,p1和p2同時向前移動。當p1遇到空格,則p2處賦值字元’0’;p2再向前移動一格,p2處賦值字元’2’;p2再向前移動一格,p2處賦值字元’%’。然後p1和p2再同時向前移動一格。以此類推最終將所有空格替換完成。

java程式碼:

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	int knum=0;
        /*計算空格的數量與字串的長度*/
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)==' ')
                knum++;
        }
        /* 替換空格後的字串的長度 */
        int newlen=str.length()+2*knum;
        int
p1=str.length()-1,p2=newlen-1; str.setLength(newlen); while(p1>=0 && p2>p1){s if(str.charAt(p1)==' '){ str.setCharAt(p2--, '0'); str.setCharAt(p2--, '2'); str.setCharAt(p2--, '%'); --p1; }else{ str.setCharAt(p2--, str.charAt(p1--)); } } return str.toString(); } }

C++程式碼:

class Solution {
public:
	void replaceSpace(char *str,int length) {
        int strlen=0,knum=0,i=0;
        /*計算空格的數量與字串的長度*/
        while(str[i]!='\0'){
            strlen++;
            if(str[i]==' ') ++knum;
            i++;
        }
        /* 替換空格後的字串的長度 */
        int newlen=strlen+2*knum;
        /* 如果替換後的長度超過了給出的固定長度則返回 */
        if(newlen>length)return;
        int p1=strlen,p2=newlen;
        while(p1>=0 && p2>p1){
            if(str[p1]==' '){
                str[p2--]='0';
                str[p2--]='2';
                str[p2--]='%';
                --p1;
            }
            else{
                str[p2--]=str[p1--];
            }
        }
	}
};

總結

遇到這種字串替換的問題,如果時間複雜度達到O(n2),則考慮從後往前替換。同時注意要將複製的過程用圖示畫出來,才不會導致程式設計出錯。

探討學習加:
qq:1126137994
微信:liu1126137994