劍指offer快速回憶之解決面試題的思路

2021-10-02 20:25:16 字數 2718 閱讀 9243

遇見面試題不要慌,能秒就秒,秒不掉可以從這三個方面入手:畫圖、舉例、分解

對稱的二叉樹、順時針列印矩陣、棧的壓入彈出序列、分行列印二叉樹、之字形列印、二叉樹中和為某一值、複雜鍊錶的複製、序列化二叉樹、字串排列

李彥巨集喜歡讓人證明

1.對稱的二叉樹

請實現乙個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。

書上思路:

只要遍歷中左右==中右左(考慮null)這顆二叉樹就是對稱的

自己的思路:

寫乙個方法fun(treenode t1,treenode t2),用來判斷t1是否和t2對稱

判斷過程中不斷遞迴即可(t1.left應該和t2.right對稱)

2.順時針列印矩陣
輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。

這道題雖然結果看起來是螺旋著向內,但是其實完全沒有必要考慮螺旋

就是一圈一圈的列印就好了,列印完最外圈,向內走一步

3.棧的壓入、彈出序列
輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如,序列 是某棧的壓棧序列,序列 是該壓棧序列對應的乙個彈出序列,但 就不可能是該壓棧序列的彈出序列。

public boolean validatestacksequences(int pushed, int popped) 

第一次做的時候,是用了乙個輔助棧,和乙個索引i,表示pushed的前i個元素要麼已經列印

要麼在輔助棧中,如果下乙個要匹配的元素(poped[j])等於pushed[i]或者輔助棧頂

就匹配成功,然後j++

其實這個思路是很混亂的,因為他的出口有兩個(就是觸發j++的情況有兩種,要麼pushed[i]==poped[j],要麼stack.peek()==poped[j]),

如果能把出口函式改造成只要乙個,思路就會很清晰,**就會很簡潔

這個題既然用了輔助棧,要把出口減成乙個的話就肯定是stack.peek()==poped[j]

因為如果pushed[i]==poped[j]這個出口能解決所有的情況的話,也就不需要輔助棧了

但是很顯然沒有輔助棧,解決不掉這道題

所以以後寫**,盡量出口只有乙個

4.分行列印二叉樹
從上到下按層列印二叉樹,同一層的節點按從左到右的順序列印,每一層列印到一行。

這題就是乙個很簡單的層序遍歷,需要保留層次資訊,我的慣用做法是佇列中塞null

書中給的做法是,使用倆全域性變數,乙個儲存本層還未列印的節點的數目,乙個儲存下一層的數目

e也能實現,但是感覺不如null好,主要是習慣了

5.之字形列印二叉樹
就是之字形zigzag,從左到右,從右到左,從左到右…

這題很煩,我第一次做錯了都不知道(因為是學長出題,沒有提交)

第二次leetcode上刷,二刷還想了一會兒,而且突然想到之前的做法是錯誤的

所以再做一次吧(就按二刷思路就行)

6.二叉樹中和為某一值的路徑
輸入一棵二叉樹和乙個整數,列印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。

這就是典型的回溯或者dfs模板題,不想多說
7. 複雜鍊錶的複製
請實現 copyrandomlist 函式,複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個 next 指標指向下乙個節點,還有乙個 random 指標指向鍊錶中的任意節點或者 null。

思路一:o(n^2)

最普通的思路,先遍歷一次把next指標部署好,(因為random指向的可能是沒

建立的節點,所以不能一次也把random部署好),然後再對每乙個random的節點賦值,

尋找random需要o(n),所以就是o(n^2)嘍

思路二:

思路一主要是尋找random花費的時間長,如果我們用hashmap記錄一下

node和node'不就好了,這樣時間會是o(n),空間o(n)

思路三:

我們將新new出來的節點接到老節點後邊形成這樣的鍊錶:

a->a'->b'->b'->c->c'->.....這樣尋找random是不是就會快點呢?

8.序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹。

之前做過的,中序遍歷和後續遍歷生成樹,對不對,但是這需要存兩個序列,

我們呢可以在中間加上null值或者特殊的符號用來標記null,這樣我們就可以

通過乙個序列生成樹

比如:[1,2,3,null,null,4,5],這個層序遍歷,當然層序遍歷就需要兩個佇列實現了

9.字串的排列
輸入乙個字串,列印出該字串中字元的所有排列。

典型的回溯演算法啊,全排列,swap

引申:8皇后用12345678初始化陣列然後全排列快嗎?

劍指offer之查詢

劍指offeroffer中有這樣一道題,把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。初看這道題沒有思路,而且也沒有想...

劍指Offer之 替換空格

把字串中的空格用 20代替。統計空格個數,從後往前賦字元。include using namespace std 函式功能 把字串中的空格用 20代替 思路 統計空格個數,從後往前賦字元 注意點 要判斷字串的位元組個數是否夠替換後的字元數,如果不夠則不能替換 void replacebland ch...

劍指offer之醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。對於這個問題,最容易想的就是乙個個數進行判斷,如 public static intgetuglynumber int ind...