1. 程式人生 > 其它 >劍指offer(c++)-03.替換空格

劍指offer(c++)-03.替換空格

技術標籤:劍指offer字串演算法資料結構c++

替換空格

1. 前景知識

字串是由若干字元組成的序列。由於字串在程式設計時使用的頻率非常高,為了優化,很多語言都對字串做了特殊的規定。

C/C++ 中每個字串都以字元’\0’作為結尾,這樣我們就能很方便地找到字串的最後尾部。但由於這個特點,每個字串中都有一個額外字元的開銷,稍不留神就會造成字串的越界。

// 如下程式碼: 
char str[10];  
strcpy(str,"0123456789")`
//若複製到str中其實需要11個位元組,因為字元有10個,但是末尾還有‘\0’ ```

為了節省記憶體,C/C++把常量字串放到單獨的一個記憶體區域

。當幾個指標賦值給相同的常量字串時,它們實際上會指向相同的記憶體地址。

2. 出題緣由(摘自:劍指offer):

在網路程式設計中,如果URL引數中含有特殊字元,如空格、’#‘等,可能導致伺服器端無法獲得正確的引數值。我們需要將這些特殊符號轉換成伺服器可以識別的字元。轉換的規則是在’%‘後面跟上ASCII碼的兩位十六進位制的表示。比如空格的ASCII碼是32,即十六進位制的0x20,因此空格被替換成"%20"。再比如’#'的ASCII碼為35,即十六進位制的0x23,它在URL中被替換為"%23"。

3. 題目

請實現一個函式,把字串中的每個空格替換成"%20"。例如輸入“We are happy.”,則輸出“We%20are%20happy.”。

解題思想

  1. 遍歷一遍字串,統計出空格的個數num_Blank,( 遍歷條件str[i] != ‘\0’ )
  2. 得到空格個數num_Blank,即可知替換為“%20”後的新字串長度(不包含結束符‘\0’) = 空格個數*2 + length-1
  3. 準備雙指標,P1、P2,P1指向原字串長度最後一個字元即str[length -1],P2指向擴充後字串末尾即str[length-1 + num_Blank*2]
  4. 遍歷原字串,當不是空格時,將字元複製到後面。
  5. 當出現空格時,將’0’,‘2’,’%'依次複製到擴充後的字串中
  6. 複製完畢後,空格數量-1,即num_Blank-1。
    遍歷過程如下圖(圖片來自於劍指offer)
    圖片來自於劍指offer
    演算法複雜度(時間O(N) 空間O(1))

解法:

class Solution {
public:
    // str:輸入字串
    // length:字串總容量
	void replaceSpace(char *str,int length) {
        int num_Blank = 0;
        for(int i = 0; str[i] != '\0'; i++){
            if (str[i] == ' ') num_Blank++;
        }
        for(int i = length-1; i >= 0; i--){
            if(str[i] != ' ') {
                // 新字串長 = 空字串*2 + 原字串-1 = num_Blank*2 + i
                str[i + num_Blank*2] = str[i];
            }
            else{
                str[i + num_Blank*2] = '0';
                str[i + num_Blank*2 - 1] = '2';
                str[i + num_Blank*2 - 2] = '%';
                num_Blank--;
            }             
        }
	}
};