1.題目
# 請實現一個函數,將一個字符串中的空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。
2.思路
# 從頭到尾遍歷字符串做替換,時間復雜度為O(n2),效率低
# 從尾到頭遍歷字符串做替換,時間復雜度為O(n),效率高
3.舉例(從尾到頭遍歷字符串)
# 邊界檢查,判斷字符數組是否為空
# 遍歷字符串,統計空格總數count_space,統計替換前字符個數count_old,統計替換后字符個數count_new,其中count_new = count_old + 2*count_space
# 邊界檢查,判斷字符數組是否越界
# 替換空格,用指針P1指向原始字符串的末尾,指針P2指向替換后字符串的末尾。向前移動指針P1,如果P1指向的元素不是空格,則將P1指向的元素復制給P2指向的位置;如果P1指向的元素是空格,則P2依次向前移動並插入%20。當P1==P2時,結束替換。
4.code
# C++字符數組存儲字符串,字符數組中編譯器自動添加字符串的結束標識’\0’,字符串結束標識在字符數組中占一個位置,注意字符數組的越界問題。
1 class Solution { 2 public: 3 // 指向字符數組的字符指針str,字符數組長度length 4 void replaceSpace(char *str,int length) { 5 6 // 邊界檢查1:判斷字符數組是否為空 7 if(str==NULL) 8 return ; 9 // 遍歷字符串,統計空格個數、替換前字符個數、替換后字符個數 10 int CountOfBlanks=0; // 空格個數 11 int Originallength=0;// 替換前字符個數 12 int len=0; // 替換后字符個數 13 14 for(int i=0;str[i]!='\0';++i) 15 { 16 Originallength++; 17 if(str[i]==' ') 18 ++CountOfBlanks; 19 } 20 21 len =Originallength+2*CountOfBlanks; 22 23 // 邊界檢查2:判斷字符數組是否越界 24 if(len+1>length) 25 return ; 26 27 // 替換空格 28 char*pStr1=str+Originallength;// 字符指針指向原始字符串的末尾 29 char*pStr2=str+len; // 字符指針指向替換后字符串的末尾 30 31 while(pStr1 != pStr2) // 替換結束的條件 32 { 33 if(*pStr1==' ') 34 { 35 *pStr2--='0'; 36 *pStr2--='2'; 37 *pStr2--='%'; 38 } 39 else 40 { 41 *pStr2--=*pStr1; 42 } 43 --pStr1; 44 } 45 } 46 };