劍指offer(c++)-03.替換空格
阿新 • • 發佈:2021-01-10
替換空格
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.”。
解題思想:
- 遍歷一遍字串,統計出空格的個數num_Blank,( 遍歷條件str[i] != ‘\0’ )
- 得到空格個數num_Blank,即可知替換為“%20”後的新字串長度(不包含結束符‘\0’) = 空格個數*2 + length-1
- 準備雙指標,P1、P2,P1指向原字串長度最後一個字元即str[length -1],P2指向擴充後字串末尾即str[length-1 + num_Blank*2]
- 遍歷原字串,當不是空格時,將字元複製到後面。
- 當出現空格時,將’0’,‘2’,’%'依次複製到擴充後的字串中
- 複製完畢後,空格數量-1,即num_Blank-1。
遍歷過程如下圖(圖片來自於劍指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--;
}
}
}
};