《劍指offer》 第2章(2)

2021-08-02 20:19:32 字數 2616 閱讀 9701

2.3.5 棧和佇列

棧:後進先出,不考慮排序的資料結構,要找到最大最小元素需要o(n)時間,若要在o(1)時間內找到最大最小值,需要對棧做特殊的設計。

面試題9:用兩個棧實現佇列

測試用例:

1.    往空佇列裡新增元素、刪除元素;

2.    往非空佇列裡新增元素、刪除元素;

3.    連續刪除元素直到隊列為空;

思路:

1.    題目意圖是用兩個先進後出的棧stack1、stack2,實現乙個先進先出的佇列

2.    插入的元素壓入stack1,不管stack2

3.    刪除元素deletehead:如果stack2為空,則從stack1依次彈出元素並壓入stack2,操作完後stack1是空,彈出stack2頂部元素;如果是stack2不為空,則直接彈出stack2頂部元素;

5.    考慮是否有問題,如果此時stack2有元素,要彈出元素,則彈出stack2頂部元素,stack2中的元素總是比stack1中的元素先到;因此刪除元素時考查stack2,插入元素時直接壓入stack1

思路:

1.    queue1中依次是插入的元素,queue2是空;

2.    刪除元素(刪除最後插入的元素):找到不為空的佇列(queue1或queue2),依次從佇列頭彈出元素並壓入另乙個佇列,直到剩下最後乙個元素,直接彈出不壓入另乙個佇列;

3.    插入元素:找到不為空的佇列(queue1或queue2),將新元素壓入佇列尾;

2.4 演算法和資料操作

重點掌握二分查詢、歸併排序、快速排序,能夠隨時正確、完整地寫出**;

如果要在二維陣列上搜尋路徑,可嘗試回溯法,考慮用遞迴、用棧模擬遞迴;

求某個問題的最優解,且問題可分為多個子問題,嘗試動態規劃;如果面試官提示在分解子問題的時候是不是存在某個特殊的選擇,採用這個特殊選擇將一定能得到最優解,考慮貪婪演算法;

2.4.1 遞迴和迴圈

遞迴:**簡潔,但函式呼叫有時間和空間的消耗,且可能發生呼叫棧溢位,可能很多計算是重複的;效能比迴圈差。

迴圈:設定迴圈的初始值和終止條件即可。

面試題10:斐波那契數列

輸入n,求斐波那契數列的第n項。

解法一:遞迴,挑剔的面試官會提示有效率問題

分析:用樹的結構分析遞迴過程,發現很多節點是重複的,n很大時重複量也很大

解法二:迴圈,從下往上計算,根據f(0) f(1)計算f(2),依次計算f(3),f(4)……f(n),

分析:複雜度是o(n)

解法三:時間複雜度o(logn)的解法,**複雜,一般不用

斐波那契數列的應用:

青蛙跳台階問題:一直青蛙依次可以跳上1級台階,也可以跳上2級台階,求該青蛙跳上衣蛾n級台階總共有多少種跳法

1級台階f(1) = 1,2級台階f(2) = 2,n級台階;如果第一次跳1級,後面的n-1級台階的跳法是f(n-1),如果第二次跳2級,後面n-2級台階的跳法是f(n-2),即f(n) = f(n-1) + f(n-2)

2.4.2 查詢和排序

順序查詢、二分查詢、雜湊表查詢、二叉排序樹查詢,要能夠隨時正確寫出

雜湊表:能夠在o(1)時間內查詢到某一元素,但需要額外的空間來實現

要對各種排序演算法的特點爛熟於胸:插入排序、氣泡排序、歸併排序、快速排序,能從額外空間消耗、平均時間複雜度、最差時間複雜度等方面比較

面試題11:旋轉陣列的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉(是的乙個旋轉,陣列的最小值為1)。輸入乙個陣列的旋轉,輸出該陣列的最小值。

測試用例:

1.    輸入陣列中有重複數字、沒有重複數字

2.    輸入陣列是乙個公升序序列(公升序序列本身也是乙個旋轉)、只有乙個元素的陣列

3.    輸入null

分析:

1.    從頭到尾遍歷可以找到最小值,演算法複雜度是o(n),這不是想要的解答

2.    旋轉後的陣列可以分為兩個排序子串行,最小的元素是兩個序列的分界線

3.    用二分查詢的思路,兩個指標p1、p2分別指向陣列第乙個元素和最後乙個元素

4.    對於一般的旋轉陣列*p1>=*p2,找陣列中間元素

5.    如果*p1《中間元素,說明中間元素屬於第乙個子陣列,將p1指向中間元素

6.    如果中間元素<*p2,說明中間元素屬於第二個子陣列,將p2指向中間元素

7.    迴圈4,5,6,直到p1與p2相鄰,則p2所指的元素是最小的元素

8.    對於邊界情況即公升序序列本身,*p1<*p2時,則p1所值的陣列是最小的元素

9.    如果*p1==中間元素==*p2,則無法判斷中間元素屬於哪個子陣列(如10111與11101),此時採用順序查詢

《劍指offer》筆記 第5章(2)

面試題42 連續子陣列的最大和 輸入乙個整型陣列,陣列裡有正數也有負數。陣列中乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度是o n 例如,陣列為,和最大的子陣列為,輸出位18。測試用例 功能測試 陣列中有正數也有負數 陣列中只有正數 陣列中只有負數 特殊輸入 陣列為nu...

劍指Offer 第2章課後題詳解

兩個佇列實現棧 2的整數次方 不同位數 有兩個排序的陣列a1和a2,內存在a1的末尾有足夠多的空餘空間容納a2。請實現乙個函式,把a2中的所有數字插入到a1中並且所有數字是排序的。其實這道題就是實現乙個歸併排序,只是在陣列中,資料是順序儲存的,如果在陣列頭部進行歸併排序,每一次操作都會移動後面所有的...

劍指offer 讀書筆記 第2章

感覺自己的 能力還在很弱,所以又第二遍仔細的閱讀劍指offer了 第二章 面試需要的基礎知識 所謂賦值運算函式就是對 這個操作符進行過載,從而使等號能夠直接用於兩個例項之間的賦值。這個c 課上學過,不過現在忘完了,只記得學過。需要考慮的點 返回值的型別宣告為該型別的引用,在函式結束前返回例項自身的引...