今天看題的時候,遇到一個替換空格的題目,分析一下哈。
題目要求:把字符串中的每個空格替換成“%20”。例如輸入“we are happy”,則輸出“we%20are%20happy”。
解題思路:我們首先想到的是:移位思想。遇到空格就將空格后的所有字符后移兩位,然后填充空格為%20。
實現代碼:
#pragma once
#include<assert.h>
#include<string.h>char* StrReplace(char* str,size_t length)
{assert(str && length > 0);char *p = str;char *p1 = str;size_t len = strlen(str)+1;size_t i = len;while(p){while(*p != ' '){p++;if(*p == '\0'){return str;}}while((p1+i) != p){*(p1+i+1) = *(p1+i-1);i--;}len+=2;i = len;*p = '%';*(p+1) = '2';*(p+2) = '0';p+=2;}return str;
}void Test()
{char str[20] = "we are happy";cout<<StrReplace(str,20)<<endl;
}
但是,我們再看看它的時間復雜度哈。顯然,每次移位操作都是O(N),這樣經過多次移位,使它的時間復雜度就變為O(N^2)。這樣的效率實在有點低。我們如何提高它的時間復雜度呢?
思路2:我們可以用計數的方式,統計字符串中總共的空格數,然后從后向前移位,使用兩個指針,p1指向字符串開始的位置,p2指向字符串尾部,移位將p2移動2*空格個數位,遇到空格后填充,直到兩指針相遇,才停止移位。如圖所示(移位過程):

實現代碼:
#pragma once
#include<assert.h>
#include<string.h>
char* StrReplace(char* str,size_t length)
{assert(str && length > 0);char *p = str;char *p1 = NULL;char *p2 = NULL;size_t len = strlen(str);int count = 0;while(*p != '\0'){if(*p == ' ')count++;p++;}count*=2;p1 = str+len; p2 = str+len+count; while(p1 != p2){if(*p1 == ' '){p2 -= 2;*p2 = '%';*(p2+1) = '2';*(p2+2) = '0';if(p1 != p) {p1--;p2--;}}else {*p2 = *p1;p1--;p2--;}}return str;
}void Test()
{char str[20] = "we are happy";cout<<StrReplace(str,20)<<endl;char str1[20] = " are happy";cout<<StrReplace(str1,20)<<endl;
}
執行結果:
