劍指offer解題思路簡述 31-40

  • 面試題31:棧的壓入,彈出序列

方法:先判斷特殊情況,如果棧1爲空或者兩個棧的長度不相等的話,直接return False,設置一個輔助棧,設置一個for循環,每次將棧1的數據壓入到輔助棧中,然後設置一個while循環,判斷輔助棧當前的棧頂元素是否等於棧二的最前面數,如果相等,兩個棧都調用pop,一直循環到不等,最後到退出for循環,判斷棧1是否爲空,如果不是空,return False。

  • 面試題32:從上到下打印二叉樹

方法一:設置一個隊列,while循環,挨個取出隊列裏的數,將它的左右節點挨個放入隊列的尾部,停止條件是隊列是否爲空。

方法:需要在上面思路的基礎上增加兩個變量,一個變量表示當前層中還沒有打印的節點數;另一個變量表示下一層節點數。然後在適當的地方加減1

  • 面試題33:二叉搜索樹的後序遍歷

方法:二叉搜索樹的特點是跟節點的左邊都比跟節點的值要小,右邊都比它大,後序遍歷中,根節點永遠在最後,前半部分的值小於跟節點,右邊部分的值大於跟節點,所以採用遞歸,每次取出該部分的最後一個數作爲跟節點,將剩下的數分成兩部分,如果存在不符合條件的直接return false。

  • 面試題34:二叉樹中和爲某一值的路徑

方法:創建一個子函數dfs([], root, expectNumber, res),[]裏存放每條路徑,res存在符合條件的路徑,每次調用self.dfs(list(path), root.left, expectNumber - root.val, res)把期望值減去當前的root值

  • 面試題35:複雜鏈表的複製

方法一:先複製一份前向鏈表,利用格外的存儲空間建立每個note的哈希對,然後搜索原鏈表,找到m_pSibling的指向節點,對應的在新鏈表上添加

方法二;在原始鏈表上覆制一份一模一樣的鏈表,得到a1-a2-c1-c2-d1-d2-w1-w2,然後若a1.m_pSibling=w1,a1.next.m_pSibling=w1.next,這樣就可以把所有節點之間的關係全部複製,最後將列表拆成兩部分

  • 面試題36:二叉搜索樹和雙向鏈表

方法:先中序遍歷,把結果存到鏈表中,然後挨個節點遍歷,for i,v in enumerate(self.arr[:-1]): v.right = self.arr[i + 1]  self.arr[i + 1].left = v

  • 面試題39:數組中出現次數超過一半的數字

方法:要找的數字出現的次數比其他所有數字出現次數之和還要多,所以可以把當前數字存下,如果重複出現則次數加一,如果出現的不一樣則次數減一,如果次數爲0,則保存下新來的數字,次數加一,最後剩下保存的數字即爲需要的數字

  • 面試題40:最小的K個數

方法一:O(n),但是需要修改原始數組,快排的思路

方法二:O(nlogn),特別適用的大規模數據,容器裏放k個數,並記錄當前最大的數,當新數來的時候進行比較,若小則替換。基於大根堆可以在O(1)時間得到k個數的最大值,nlogn的時間完成最大值的刪除和插入

 

 

           

           

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章