字符串替換空格

需求:

請實現一個函數,把字符串中的每一個空格替換成"%20",例如,輸入"We are happy!",則輸出"We%20are%20happy!"。html

 

分析:

思路一

直接從頭開始替換。ios

1.從W開始遍歷,找到第一空格 We後面的空格;c++

2.找到字符串結尾的地方,把We空格以後全部的字符串都日後移動兩個位置(由於%20比空格多佔兩個位置);數組

3.把We後面的空格替換成%20,繼續查找下一個空格,即重複步驟1;app

4.找到最後的結束符結束循環。函數

從頭開始替換法,因爲每次遇到空格都須要把空格後面的字符日後移動2個空格,時間複雜度爲O(n**2)。測試

見示例代碼replaceSpaceFromHeadspa

 

思路二

從尾部開始替換。code

1.先從頭開始把字符串遍歷一次,統計其中的空格數量;htm

2.計算若是可以成功替換的話,字符的總長度是2*空格數+原始字符串長度。(由於%20比空格多佔兩個位置,因此多出來的長度應該是空格數的兩倍);

3.從最後一個字符開始,若是字符不是空格,則一次把字符從最終的長度開始移動;

4.遇到空格,就是空格從後面的位置往前填寫02%(由於是從後往前填),而且把剩餘空格數減一;

5.當空格數爲0或者替換到第一個字符則中止循環。

從尾開始替換法,因爲只須要把原始字符串遍歷2次,每次的時間複雜都都是O(n),因此總體時間複雜度爲O(n),比從頭開始替換法效率更高。

見示例代碼replaceSpaceFromTail

 

擴展需求見:http://www.javashuo.com/article/p-gajlnknt-ct.html

 

c++示例代碼

  1 #include <iostream>
  2 
  3 using namespace std;
  4 const int g_length = 100;
  5 
  6 /************************************************************************/
  7 /* @brief 從頭開始替換字符串中的空格
  8 /* @param info 字符串
  9 /* @param length 字符數組的可用長度
 10 /* @return false表示替換失敗,success表示替換成功
 11 /************************************************************************/
 12 bool replaceSpaceFromHead(char* info, const int length)
 13 {
 14     if (!info || length <= 0)
 15     {
 16         return false;
 17     }
 18 
 19     int bSuccess = true;
 20     int currentLen = 0;
 21     int i = 0;
 22     //從頭開始查找,一直到最後一個字符
 23     while (info[i] != '\0')
 24     {
 25         //若是是空格,開始替換
 26         if (info[i] == ' ')
 27         {
 28             int j = i;
 29             //找到字符串的末尾
 30             while (info[j] != '\0')
 31             {
 32                 ++j;
 33             }
 34             //長度不夠了,失敗。新長度是索引加上增長的兩個字符加上1
 35             if (j + 2 + 1 >= length)
 36             {
 37                 bSuccess = false;
 38                 break;
 39             }
 40             //把每一個字符日後活動兩個位置
 41             while (j > i)
 42             {
 43                 info[j + 2] = info[j];
 44                 --j;
 45             }
 46             //把當前的空格替換成%20而後繼續查找下一個空格
 47             info[i] = '%';
 48             info[i + 1] = '2';
 49             info[i + 2] = '0';
 50             i += 2;
 51         }
 52         //若是不是空格繼續找下一個
 53         else
 54         {
 55             ++i;
 56         }        
 57     }
 58     return bSuccess;
 59 }
 60 
 61 /************************************************************************/
 62 /* @brief 從尾開始替換字符串中的空格
 63 /* @param info 字符串
 64 /* @param length 字符數組的可用長度
 65 /* @return false表示替換失敗,success表示替換成功
 66 /************************************************************************/
 67 bool replaceSpaceFromTail(char* info, const int length)
 68 {
 69     if (!info || length <= 0)
 70     {
 71         return false;
 72     }
 73 
 74     int bSuccess = true;
 75     int currentLen = 0;
 76     int i = 0;
 77     int spaceNum = 0;
 78     //查看有多少個空格
 79     while (info[i] != '\0')
 80     {
 81         if (info[i] == ' ')
 82         {
 83             spaceNum += 1;
 84         }
 85         ++i;
 86     }
 87 
 88     //最終長度是索引加上增長的兩個字乘空格數符加上1
 89     int newLen = i + spaceNum * 2 + 1;
 90     //長度不夠直接返回替換失敗
 91     if (newLen > length)
 92     {
 93         return false;
 94     }
 95 
 96     //當空格數爲0就能夠中止循環了
 97     for (int j= newLen; spaceNum > 0 && i > 0; --i)
 98     {
 99         if (info[i] != ' ')
100         {
101             info[j] = info[i];
102             --j;
103         }
104         else
105         {
106             //把當前的空格替換成%20而後繼續查找下一個空格
107             info[j] = '0';
108             info[j - 1] = '2';
109             info[j - 2] = '%';
110             j -= 3;
111             spaceNum -= 1;
112         }
113     }
114 
115     return bSuccess;
116 }
117 
118 int main()
119 {
120     char szInfo[g_length] = { "We are happy!" };
121     char szInfo1[g_length] = { "We are happy!" };
122 
123     cout << "原始字符串:" << endl << szInfo << endl;
124 
125     bool success = replaceSpaceFromHead(szInfo, g_length);
126     
127     cout << endl << "從頭開始替換法:" << endl;
128     if (success)
129     {
130         cout << szInfo << endl;
131     }
132     else
133     {
134         cout << "替換失敗" << endl;
135     }
136 
137     success = replaceSpaceFromTail(szInfo1, g_length);
138 
139     cout << endl << "從尾開始替換法:" << endl;
140     if (success)
141     {
142         cout << szInfo << endl;
143     }
144     else
145     {
146         cout << "替換失敗" << endl;
147     }
148     
149     cout << endl;
150 
151     return 0;
152 }

 

測試結果

相關文章
相關標籤/搜索