面試題 5:替換空格
思路一:時間複雜度為 o(n2) 的解法。
考慮怎麼替換的操作,最直觀的方法是從頭到尾掃瞄字串,每次碰到空格後進行替換。由於是把 1 個字元替換成 3 個字元,必須將後面的向後移兩個位元組。
假設字串的長度是 n。對每個空格字元,需要移動後面 o(n
) 個字元,因此對於含有 o(n) 個空格字元的字串而言,總的時間複雜度為 o(n2)。
其實,如果思路反過來,從後往前替換,其實移動的次數是比從前往後要少的。
思路二:時間複雜度為 o(n) 的解法。
先遍歷陣列,統計陣列裡面空格的數量,並計算字元陣列的總長度;
由於每替換乙個空格,長度就增加 2 個位元組,因此有 n 個空格的話,字元陣列長度就會增加 2n。
準備兩個指標,p1 和 p2。p1指向原始字串的末尾,p2指向替換之後的末尾。
依次複製字串的內容,直到第乙個指標碰到第乙個空格。
把第乙個空格替換成 "%20",把第乙個指標向前移動 1 格,第二個指標向前移動 3 格。
依次向前複製字串中的字元,直至碰到空格。
替換字串中的倒數第二個空格,把第乙個指標向前移動 1 格,把第二個指標向前移動 3 格。
上述思路的**:
.....(後續補充)
本題考查點:
面試題 6:從頭到尾列印鍊錶
題目:輸入乙個鍊錶的頭節點,從尾到頭反過來列印出每個節點的值。思路一:要解決這個問題肯定要遍歷。遍歷的順序是從頭到尾的,可輸出是從尾到頭的,所以很顯然是「先進後出」的結構,由此可想到利用棧。
.....(後續補充)
思路二:想到棧後,不難想到利用遞迴也可得到想要的結果。而遞迴本質上也是乙個棧結構。要實現反過來輸出鍊錶,我們每訪問到乙個節點的時候,先遞迴輸出後面的節點,再反過來輸出該節點自身。
.....(後續補充)
利用遞迴有乙個問題:當鍊表非常長的時候,就會導致函式呼叫的層級很深,從而有可能導致函式呼叫棧溢位。所以還是棧基於迴圈的要好一些。
劍指offer面試題7
面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...
劍指offer面試題11
面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...
劍指offer面試題15
面試題15 鍊錶中倒數第k個結點 題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第乙個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。預備知識 鍊錶結點的定義如下 ...