我們可以先遍歷一次字串,這樣就能計算出替換之後的字串的總長度。也就是說,如果我們原來字串中的某乙個字元替換成某乙個更長的,那麼替換之後字串的總長度就會變長。此一步驟的目的就是,計算出替換後總長度,才好分配記憶體去儲存。
例如:將hello world中的字元』l』替換成"handsome",那麼經過檢查會發現字串中的』l』的數量為三個,替換成"handsome"後長度增加了7,那麼一共有三個』l』需要替換,那麼原空間就需要增加21。
我們從字串的後面開始複製和替換。首先需要準備兩個指標:p1,p2。p1指向原字串的末尾,而p2指向替換之後的字串的末尾。這樣通過一前一後兩個指標,就將所有的字元移動了一遍。當左後p1==p2時,所有的字元就被替換完了。
具體步驟:
第乙個指標指向字串的末尾,將第二個指標指向替換之後的字串的末尾,把第二個指標指向替換之後的字串的末尾。
依次賦值字串的內容,直至第乙個之好著呢碰到第乙個需要替換的字串。
將第乙個需要替換的字元替換成需要替換的字串。指標p1向前移動一,指標p2向前移動向應的長度。
依次向前賦值字串中字元,直到遇到下乙個需要替換的字元。
當最後兩個指標相遇的時候,表示全部的字元都被替換完成。
1.**(原書中的**)
/*
*源**中是將字串中的空格換成,"%20"
*//*length為字元陣列中string的總的容量*/
void replacefunc(char string,int length)
/*originallength為字串string的實際長度*/
int originallength = 0;
int numberofblank = 0;
int i;
while(string[i] != '\0')
++i;
}/*newlength為把空格替換成%20之後的長度*/
int newlength = originallength + numberofblank*2;
if(newlength > length)
return;
int indexoforiginal = originallength;
int indexofnew = newlength;
while(indexoforiginal >= 0 && indexofnew > indexoforiginal)
else
--indexoforiginal;
}}
拓展
本例給了一種很好的思路,從後往前查詢字串,有效的減少了時間複雜度。利用兩個指標來對字串進行處理,對很多字串問題都有不錯的啟示作用。
劍指offer 替換字串
思路 如果直接替換,就有可能覆蓋修改在字串後面的記憶體。如果建立新的字串並在新的字串上做替換,我們就可以分配足夠多的記憶體。對於任何乙個函式,我們要做哪些基本的檢測 1.傳入的引數有效性 2.函式體邊界的判斷 3.返回值正確返回 void replaceblank char str,int leng...
劍指Offer 替換字串
我是鏈結 2.題目描述 將乙個空格字元 替換為三個字元 20 需要三個字元的空間,則在第乙個空格後的字元需要後挪 2 1格,第二個空格後的字元需要後挪2 2格,第三個空格後的字元需要後挪3 2格 依此類 推。4.思路 遍歷字串記錄其中的空格個數,最後再根據空格的順序後挪該空格後的字串,同時替換空格 ...
《劍指offer》字串中的字元替換
char str 字串 int length 字串的長度 length為牛客系統規定字串輸出的最大長度,固定為乙個常數 class solution 分兩步 第一 先查詢字元陣列中有多少個空格,假設有n個空格。增加替換後陣列的長度,因為乙個空格用 20 三個字元去替換,所以每個空格就會是陣列增加2g...