劍指Offer 第2版 面試題5 替換空格

2021-09-24 06:21:05 字數 1674 閱讀 1687

解題思路

從字串的尾部開始複製和替換。首先準備兩個指標,p1和p2,p1指向原始字串的末尾(結尾符號),而p2指向替換之後的字串的末尾(結尾符號);

接下來向前移動指標p1,逐個把它指向的字元複製到p2指向的位置,直到碰到第乙個空格為止,p2也隨之向前移動。

p1碰到第乙個空格之後,把p1向前移動1格,在p2之前插入字串"%20"。由於"%20"的長度為3,同時也要把p2向前移動3格。

接著我們重複前面這一過程,直到p1和p2指向同一位置,表明所有空格都已經替換完畢。

/*new_length為把空格替換成'%20'之後的長度*/

int new_length = original_length +

2* number_blank;

int index_original = original_length;

//指向原始字串結尾符號『\0』

int index_new = new_length;

//指向替換後字串結尾符號『\0』

/*index_original指標開始向前移動,如果遇到空格,替換成'%20',否則進行複製操作*/

while

(index_original >=

0&& index_new > index_original)

else

--index_original;

// p1向前移動一格}}

};

知識拓展:

1.時間複雜度:

(1)時間頻度:乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t(n)。

(2)時間複雜度:在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度t(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。 一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作t(n)=o(f(n)),稱o(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度。

2.空間複雜度:

空間複雜度(space complexity)是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。

劍指offer 面試題5

題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值。說明 本題要求不能破壞原本的資料結構。include include using namespace std struct listnode void printlistreverse listnode phead while nodes...

劍指offer 面試題5

在完成第五題之前我想先複習一下鍊錶的基本操作如下 struct listnode 鍊錶尾插法 注意頭指標phead的定義 判斷鍊錶是否為空 void addtotail listnode phead,int value else pnode pnext pnew 刪除鍊錶中的某個節點 void re...

劍指offer 面試題5

到現在為止,看過的書 有一定量了,並且也參加了個比賽,給自己的總體感覺 程式設計需要的是靈活的頭腦,書裡的東西只是講個規則 思想,其實際實現可以千差萬別!潛在的規則 靈活的思維 程式!在做面試題5時,發現utilities資料夾下的內容太好了,基本上是那些資料結構的實現 鍊錶 二叉樹 樹等 缺個圖 ...