请实现一个函数,将字符串中的空格替换成“%20”
生活随笔
收集整理的這篇文章主要介紹了
请实现一个函数,将字符串中的空格替换成“%20”
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、傳統做法
從開始位置向后遍歷,如果發現空格,則挪動后面的字符串騰出 2 個字符的空間,寫入“%20”,直至到字符串末尾。
(灰色部分是每次要挪動的字符)
這種方法非常直觀,但是性能較差。假設字符串長度為 n,其中空格數量為 m,那么時間復雜度大概為 O(m*n),簡化為 m = n,那么時間復雜度就變成了 O(n^2) 。
二、高性能做法
為了提高性能,需要盡可能的減少后面字符不必要的挪動次數,即:最后一次就能將后面的字符挪動到最終的位置上,方法就是從后面開始遍歷字符串。
為了達到上述目的,需要提前知道空格替換完之后最終的字符串大小。所以開始遍歷一遍字符串,假設字符串長度為 n,空格數量為 m,那么空格替換完之后的字符串長度為 len = n + m * 2 。
下一步就是開始搬運字符和替換空格的過程:
假設有兩個指針分別指向了原始字符串末尾位置(p1)和最終字符串的末尾位置(p2)。首先要從后向前遍歷,查看 p1 指向的字符是否是空格,如果不是的話就將該字符挪到 p2 位置上,由此類推,p1 不斷向字符開始位置遍歷,直至結束。
上述方法字符串每個字符挪動一次就行了,故時間復雜度為 O(n) 。
三、測試
#include <iostream> #include <string.h>void Print(const char *const p); void ReplayBlank(char *const data, const size_t &len); void test(const char *const data, const size_t &len);int main(int argc, char *argv[]) {test("I love China", 13);test(" I love China ", 15);test("I_love_China", 13);test("", 0);test(" ", 1);return 0; }void test(const char *const data, const size_t &len) {char *src = new char[len * 2]();memcpy(src, data, strlen(data));Print(src);ReplayBlank(src, strlen(src) + 1);Print(src);std::cout << "----------------------" << std::endl;delete []src;return; }void Print(const char *const p) {if (p == nullptr)return;std::cout << p << std::endl;return; }void ReplayBlank(char *const data, const size_t &len) {if (data == nullptr || len == 0)return;size_t blank_count = 0;int i = 0;while (i < len){if (data[i] == ' ')blank_count++;i++;}if (blank_count == 0)return;size_t len_all = len + blank_count * 2;char *p1 = data + len;char *p2 = data + len_all;for (i = 0; i <= len; ++i){if (*(p1 - i) != ' '){*p2 = *(p1 - i);p2--;}else{*(p2--) = '0';*(p2--) = '2';*(p2--) = '%';}}return; }結果:
I love China I%20love%20China ----------------------I love China %20I%20love%20China%20 ---------------------- I_love_China I_love_China --------------------------------------------%20 ----------------------注意,代碼中要展現出判空、空字符串、沒有空格、全是空格等情況的處理。
?
(SAW:Game Over!)
總結
以上是生活随笔為你收集整理的请实现一个函数,将字符串中的空格替换成“%20”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OS / Linux / clone、f
- 下一篇: CPU 的 ring0、ring1、ri