劍指offer 題5 替換空格

2021-10-01 03:16:29 字數 1303 閱讀 5391

題目

首先拿到題目,第一感覺就是乙個 『空格』 變成了 『%20』 那字串長度肯定變長

所以我第一反應是建立新的字串b,然後從a乙個個讀取字元,遇到『空格』就用 『%20』 來替代,只要b空間足夠,遍歷一遍就成了。

但是,面試再簡單也不是考這種題目。

於是這時候面試官可能會講了:

要求在原來的字串上進行操作

這時候問題就有點意思了,長度變長絕對會覆蓋後面的字元,那麼肯定需要移動後面的字元,移就移唄,總比不動好,於是:

所以要另找出路,就想降低移動次數,正著不行,反著總可以了吧

既然長度要變,不是可以把長度給算出來麼,乙個蘿蔔乙個坑,一一對應總不會錯。

1、先遍歷一遍字串,將空格個數計數出來,算出最終字串總長度

2、利用兩個指標p1、p2。一開始p1指向原始字串末尾,p2只想最終的末尾。

3、p1一格一格向前移動,每移動一次,就將指向的字元(非空)複製到p2(複製完後p2也隨之向前移動一格)

4、當p1遇到空格時,p2所在的地方依次填充 0 2 % (即倒著的%20)

5、如果p1與p2相遇了,那麼就停止,否則繼續進行

來個圖示比較清楚

我們發現所有的字元值移動了1次,這樣時間效率提高了,複雜度就變為了o(n)

好了,思路有了,直接敲**

void

replaceblank

(char string,

int length)

//新的長度

int newlength = originallength+numberofblank*2;

if(newlength>length)

return

;//"指標" p1 p2

int indexoforiginal=originallength;

int indexofnew=newlength;

while

(indexoforiginal >=

0&& indexofnew > indexoforiginal)

else

string[indexofnew--

]=string[indexoforiginal]

;--indexoforiginal;

}}

劍指Offer 替換空格 5

在字串後任意填充字元,使得字串替換前的長度 替換後的長度,例如上面這個例子,替換前長度為12,替換後的長度為16,所以在原來字串的基礎上填充2位.p1指向填充前的末尾,p2指向填充後的末尾 然後p1,p2一起前移,如果p1不是空格,則p2 p1 如果p1是空格,則p2依次輸入 02 1 public...

劍指offer 5 替換空格

首先遍歷一次字串,記錄字串的實際長度,和空格數目,接著計算出替換後新字串的長度,然後用兩個指標p和q分別指向原字串尾位址和新字串的尾位址,倒序遍歷,遇到空格就讓q向前走三步,否則就讓q p,直到p走到頭。時間複雜度 o n class solution int changelength origin...

劍指offer 5 替換空格

思路1 思路2 1 先遍歷一次字串,這樣就能統計出字串中空格的總數,並可以由此計算出替換之後的字串的總長度。2 從字串的後面開始複製和替換。準備兩個指標,p1和p2。p1指向原始字串的末尾,而p2指向替換之後的字串的末尾。接下來向前移動指標p1,逐個把它指向的字元複製到p2指向的位置,直到碰到第乙個...