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 課上學過,不過現在忘完了,只記得學過。需要考慮的點 返回值的型別宣告為該型別的引用,在函式結束前返回例項自身的引...