題目
首先拿到題目,第一感覺就是乙個 『空格』 變成了 『%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指向的位置,直到碰到第乙個...