請實現一個函數,把字符串中的每一個空格替換成"%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)。測試
見示例代碼replaceSpaceFromHead。spa
從尾部開始替換。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
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 }