如果採用傻瓜式的做法,從頭開始找空格字元,再進行替換,那麼需要將空格後面的所有字元都往後移動2個位置。假設字串長度為n,對每個空格字元,需要移動後面o(n)個字元,因此對含有o(n)個空格字元的字串而言總的時間效率是
這個時候考慮從原字串的後面開始進行字串替換操作。先遍歷一次字串,統計出空格的數目,然後可以求出替換之後陣列的長度為原字串長度加上空格的數目乘以2。首先準備兩個指標,p1和p2,p1指向原始字串的末尾,p2指向替換之後的字串的末尾)。接下來向前移動指標p1,逐個把它指向的字元複製到p2指向的位置,直到碰到第乙個空格為止。碰到第乙個空格之後把p1向前移動1格,在p2之前插入字串「%20」,同時把p2向前移動3格。重複以上操作,當p1和p2指向同一位置的時候,表明所有的空格都已經替換完畢。這種方法所有的字元都只需要移動一次,時間複雜度為o(n)。
下面是演示的步驟:
/*length為字元陣列string的總容量*/
void replaceblank(char string, int length)
/*originallength為字串string的實際長度*/
int originallength = 0;
int numberofblank = 0;
int i = 0;
while (string[i]!='\0')
//printf_s("%d\n", originallength);
//printf_s("%d\n", strlen(string));
/*newlength為把空格替換為'%20』之後的長度*/
int newlength = originallength + numberofblank * 2;
if (newlength > length)
return;
int indexoforiginal = originallength;
int indexofnew = newlength;
while (indexoforiginal>=0&&indexoforiginal複習:
二刷**:
void replaceblank(char string, int length)//length是字元陣列的總容量,需要保證替換之後陣列的長度能夠容納新的字串
int newlength = originallength + numberofblank * 2;
if (newlength > length)
return;
int indexoforiginal = originallength;
int indexofnew = newlength;
while (indexoforiginal>=0&&indexofnew>indexoforiginal)
else
}}
劍指Offer 面試題5替換空格
note 劍指offer的題可以在牛客網上做題驗證思路的正確性 思路 因為stringbuffer本身是可變字串序列,可以修改,實際上它的可變是犧牲空間換取的。替換可能導致超出其容量,char陣列的複製和新建。public string replacespace stringbuffer str s...
劍指offer 面試題5 替換空格
拿到這個題時,第乙個要考慮的就是記憶體夠不夠的問題。因為原來空格是乙個字元,現在要將乙個空格替換為三個字元,記憶體會變大。現在假設是在記憶體足夠的情況下修改。過程如下 完成乙個空格的替換 完成替換 測試用例的考慮 如下 void changestr char arr,int sz int i 0 i...
劍指offer面試題5 替換空格
面試題5 替換空格 思路一 新建乙個足夠的大小的字串空間,然後依次將字元拷貝,遇到空格進行三個字元的填充,接著重複執行前面的操作將整個字串替換完畢。時間複雜度o n 空間複雜度o n 思路二 從頭到尾掃瞄字串,每次遇到空格將後續字元向後移動兩個位置,然後進行填充。時間複雜度o n 2 思路三 從尾部...