劍指offer解題思路簡述 21-30

  • 面試題21:調整數組順序使奇數位於偶數前面

方法一:設置前後兩個指針,前面的指針往後移,當前面的指針指向的數是偶數時,後面往前移,當後面的指針指向奇數時,兩個指針的數據交換,知道兩個指針重合

方法二:從頭遍歷,偶數放一個list裏,奇數放一個list裏,然後拼接兩個list,需要額外的空間

  • 面試題22:鏈表中倒數第K個節點

方法一:先遍歷一遍鏈表,得到鏈表的長度l,然後指針走l-k步

方法二:兩個指針,第一個指針走k-1,然後從第K補開始,第二個指針開始一起走,當第一個指針式到尾節點時,第二個指針正好指向倒數第k個,要注意代碼的魯棒性:判斷K是否爲正數,k是否大於鏈表長度,鏈表是否是空

  • 面試23:鏈表中的入口節點

方法一:第一步,確定是否有環,設置兩個指針,一個一次走一步,一個一次走兩步,當走兩步的到了鏈表的結尾還沒遇到走的慢的,則沒有環,否則有環。第二步,確定環中節點的個數,在第一步的基礎上,一個指針不動,另一個指針每次移動一步,直到再次相遇,計數n。第三步,重新用兩個指針,一個先走n步,另一個再走,相遇的點即爲入口節點

方法二:每次把節點放入set類型中,如果有重複說明即是環的入口

  • 面試24:反轉鏈表

方法1:設置兩個指針,一個a指向pHead.next,另一個b指向a.next,然後在while循環中,pHead,a,b依次往後移動

方法2:遞歸 https://zhuanlan.zhihu.com/p/60117407?from_voters_page=true  全網最詳細,思路就是先找到尾節點作爲頭節點,然後依次往前挨個反轉

  • 面試25:合併兩個排序的鏈表

方法一:while循環,創建兩個空節點ans=res=ListNode(0),res負責反覆循環裏面不斷指向合併鏈表的下一位,循環的退出條件是其中一個鏈表的next爲空,退出後將rest.next指向剩下的不爲空的那個鏈表,return ans.next

方法二:遞歸,

  • 面試26:樹的子結構

方法:構建一個子函數專門判斷每個節點是否相等,主函數裏挨個遍歷左右節點作爲根節點傳入到前面構建的函數中。

  • 面試題27:二叉樹的鏡像

方法:遞歸,交換左右子樹,然後分別將左右節點作爲根節點遞歸調用函數

  • 面試題28:對稱的二叉樹

方法:主函數裏調用判斷是否爲鏡像的子函數,子函數裏遞歸判斷sMirror(left.left,right.right) and self.isMirror(left.right,right.left)

  • 面試題29:順時針打印矩陣

方法:先判斷行數爲1和列數爲1的情況,單獨處理,然後while循環,設置一個標誌位,轉了幾圈。while(row>i*2 and col>j*2):這個是每一圈的左上角的條件。裏面分成四個for 循環,每個while的條件是i或者j和行數列數以及flag的關係。最後while循環結束,處理特殊情況:當是正方形且邊長爲奇數,則需要append最中心的數;若行列不相等且都是奇數,則pop掉最後一個數。

  • 面試題30:包含min函數的棧

方法:建立一個輔助棧,存在當前狀態的最小值,push時比較push元素和當前最小元素的值,如當前元素較小,則push到輔助棧,pop時兩個棧需要同時pop

 

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