1. 程式人生 > 實用技巧 >【劍指offer】替換空格

【劍指offer】替換空格

題目連結:https://www.nowcoder.com/practice/4060ac7e3e404ad1a894ef3e17650423?tpId=13&&tqId=11155&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

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


解題思路:先掃描一遍字串,統計出空格數,從而得出替換後的字串的長度。假設原字串為為s1,替換後的字串為s2,設定兩個指標p1,p2.開始時,p1指向原字串s1的末尾,p2指向替換後字串s2的末尾。然後從後往前對原字串進行掃描,如果p1遇到空格,那麼在s2中填入“%20”,如果遇到字元,那麼s2填入該字元。時間複雜度為O(Length),Length為替換後字串的長度。


Cpp Code

class Solution {
public:
	void replaceSpace(char *str,int length) {
        int space_num=0,oldlen=0,newlen=0;
        if(str==NULL||length<=0){
            return;
        }
        int i=0;
        while(str[i]!='\0'){//C/C++字串以‘\0’結尾
            if(str[i]==' '){//統計空格數量
                space_num++;
            }
            oldlen++;
            i++;
        }
        newlen=oldlen+space_num*2;//替換後的字串長度
        int j=newlen;
        i=oldlen;
        while(i>=0&&j>i){//退出條件,j==i說明繼續掃描已不再需要替換,故j>i也可以是判斷條件,不要這個條件也可以
            if(str[i]==' '){//空格,因為是從後往前掃描,故逆序填入
                str[j--]='0';
                str[j--]='2';
                str[j--]='%';
            }
            else{
                str[j--]=str[i];//非空格直接填入
            }
            i--;//指標向左移動
        }
        
	}
};

Java Code

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	//return str.toString().replace(" ","%20");//利用自帶函式
        
        StringBuilder sb=new StringBuilder();//StringBuilder
        int len=str.length();
        for(int i=0;i<len;i++){
            if(str.charAt(i)==' '){
                sb.append("%20");
            }
            else{
                sb.append(str.charAt(i));
            }
        }
        return sb.toString();
    }
}