劍指offer(一):替換空格 字串 C語言
阿新 • • 發佈:2018-11-28
題目: 替換空格
請實現一個函式,將一個字串中的空格替換成“%20”。
例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。
思路1:建立兩個陣列 ,一個存放原來的,一個存放替換後的 時間複雜度過高O(n^2) ,程式碼如下:
#include<stdio.h> #include<string.h> #include<assert.h> int InsteadBlank_1(char *str1,char *str2) { assert(str1!=NULL); while(*str1) { if(*str1!=' ') { *str2= *str1; *str2++; } else { strcpy(str2,"%20"); str2 = str2+3; } *str1++; } *str2 = '\0';//呼叫strcpy 手動加一個'\0' return 0; } int main() { char str1[]="we are happy"; char str2[20]; InsteadBlank_1(str1,str2); printf("%s \n ",str2); getchar(); return 0; }
思路2
1.判斷:計算原來的count長度, 計算空格數
2.求更改之後的長度,一個空格多加兩個單位長度 ' ' ----> '%20'
3.賦值操作: 從後往前賦值。 如果遇到' ',就將%20 從後往前依次賦給相應的位置。
具體操作如下:
1.先遍歷一次字串,這樣就可以統計出字串空格的總數,並可以由此計算出替換之後的字串的總長度。
每替換一個空格,長度增加2,因此替換以後字串的長度等於原來的長度加上2乘以空格數目。
例如: "we are happy. " 加上空格一共有14個字元(包括'\n'),如果轉換為"we%20are%20happy",一共18個字元
2. 從字串的尾部開始複製和替換。首先準備兩個指標,P1和P2,P1指向原始字串的末尾,P2指向替換之後的字串的末尾。
向前移動指標P1,逐個把它指向的字元複製到P2指向的位置,直到碰到第一個空格為止。
碰到第一個空格之後,把P1向前移動1格,在P2之前插入字串"%20"。由於"%20"的長度為3,同時也要把P2向前移動3格。
如圖所示:
#include<stdio.h> #include<string.h> #include<assert.h> void InsteadBlank_2(char *str,int length) { assert(*str!=NULL); if(str==NULL || length ==0) //判斷str是否為空,以及字串的長度 { return ; } int BlankNum = 0; //空格數 int OldLength = 0; //原字串長度 int i=0; while(str[i++]!='\0') //遍歷字串 { if(str[i] ==' ') //當遇到空格的時候 { BlankNum++; //空格數目進行累加操作 } OldLength++; //字串長度計算 } int NewLength_Index = OldLength +BlankNum*2; //將空格數目-->%20 所需要的長度 設為指標p2 int OldLength_Index = OldLength; //之前的長度 設為指標p1 while(OldLength_Index>=0 && OldLength_Index<NewLength_Index) { if(str[OldLength_Index] == ' ') //從後向前遍歷,遇到空格,就將%20從後往前進行賦值操作 { str[NewLength_Index--] = '0'; str[NewLength_Index--] = '2'; str[NewLength_Index--] = '%'; } else//沒有空格,直接賦值 { str[NewLength_Index--]=str[OldLength_Index] ; } OldLength_Index--; } } int main() { char str3[]="we are happy."; int length = strlen(str3); InsteadBlank_2(str3,length); printf("%s",str3); getchar(); return 0; }