【劍指Offer】2、替換空格


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

  解題思路:
  對於這個題目,我們首先想到原來的一個空格替換為三個字符,字符串長度會增加,因此,存在以下兩種不同的情況:(1)允許創建新的字符串來完成替換。(2)不允許創建新的字符串,在原地完成替換。

  第一種情況比較簡單。對於第二種情況,有以下兩種解法:

  • 時間復雜度為O(n^2)的解法
      從頭到尾遍歷字符串,當遇到空格時,后面所有的字符都后移2個。
  • 時間復雜度為O(n)的解法。
      可以先遍歷一次字符串,這樣可以統計出字符串中空格的總數,由此計算出替換之后字符串的長度,每替換一個空格,長度增加2,即替換之后的字符串長度為原來的長度+2*空格數目。接下來從字符串的尾部開始復制和替換,用兩個指針P1和P2分別指向原始字符串和新字符串的末尾,然后向前移動P1,若指向的不是空格,則將其復制到P2位置,P2向前一步;若P1指向的是空格,則P1向前一步,P2之前插入%20,P2向前三步。這樣,便可以完成替換,時間復雜度為O(n)。

  舉例:

  編程實現(Java):

	//第一種情況:創建新的字符串實現:
	public String replaceSpace(StringBuffer str) {
    	String res="";
        for(int i=0;i<str.length();i++){
            char c=str.charAt(i);
            if(c==' ')
                res += "%20";
            else
                res += c;
        }
        return res;
	}

	//第二種情況:原地替換,O(n)的解法
	public String replaceSpace(StringBuffer str) {
        if(str==null)
            return null;
        int numOfblank = 0;//空格數量
        int len=str.length();
        for(int i=0;i<len;i++){  //計算空格數量
            if(str.charAt(i)==' ')
                numOfblank++;
        }
        str.setLength(len+2*numOfblank); //設置長度
        int oldIndex=len-1;  //兩個指針
        int newIndex=(len+2*numOfblank)-1;
        
        while(oldIndex>=0 && newIndex>oldIndex){
            char c=str.charAt(oldIndex);
            if(c==' '){
                oldIndex--;
                str.setCharAt(newIndex--,'0');
                str.setCharAt(newIndex--,'2');
                str.setCharAt(newIndex--,'%');
            }else{
                str.setCharAt(newIndex,c);
                oldIndex--;
                newIndex--;
            }
        }
        return str.toString();
    }

  本題有實際的現實意義,在網絡編程中,如果URL參數中含有特殊字符,則可能導致服務器端無法獲得正確的參數值,因此可以通過替換的方法將其轉換為可以識別的字符。轉換規則就是%后面加上該字符ASCII碼的16進制表示,如這里的空格,ASCII碼是0x20(十進制的32),所以可以替換為%20。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM