一、基礎知識
棧:後進先出的線性表;stl方法包含push(x),pop(),top(),empty()
佇列:先進先出的線性表;stl方法包含push(x),pop(),top(),empty()
二、目錄
使用佇列實現棧
三、 解題
1.使用佇列實現棧
這題在劍指offer中是面試題9(用兩個佇列實現棧),leetcode229。使用佇列實現棧。
對於1,2,3,4,5這樣乙個序列,
用棧儲存,從上至下為5,4,3,2,1。5為棧頂,使用top返回5,push(x)則x變為棧頂;
用佇列儲存,從上至下為5,4,3,2,1。1為隊頭,使用top返回1,push(x)x插入尾部,1還是隊頭;
思路:使用兩個佇列,queue1佇列依次push 1 2 3,這時1為隊頭,使用pop彈出的是1,不符合棧後進先出的要求,於是先將1,2 push進queue2,query1剩餘3,此時pop彈出為3,實現了彈出棧頂元素的需求。如需要彈出2,則重複步驟,先將1 push進queue1,直到queue2剩下最後乙個元素即2,此時彈出可得到2
待寫
2.使用棧實現佇列
這題在劍指offer中是面試題9(用兩個棧實現佇列),leetcode232。
思路:使用兩個棧,push值到stack1中,front時將stack1的棧頂push進stack2中,原先stack1中的棧頂就變成stack2的棧底,原先stack1的棧底(隊首)變為stack2棧頂,用top可得到stack2的棧頂,也就是隊首元素。
#include
#include
class
myqueue
intfront()
}int res = stack2.
top();
return res;
}void
pop()}
;int
main()
3.包含min函式的棧
這題在劍指offer中是面試題9(用兩個棧實現佇列),leetcode155。
設計乙個棧,包含push,pop,top,getmin,要求演算法複雜度為o(1)
思路:由於要求複雜度為常數級,故不能採取遍歷的方式記錄最小值;故使用乙個最小值棧,資料棧中每push乙個值,直接push就好;對應最小值棧需要將新值和棧頂元素進行進行比較,誰小就push誰。
};4.出棧序列是否合法
已知從1至n的數字序列,按順序入棧,每個數字入棧後即可出棧,也可在棧中停留,等待後面的數字入棧出棧後,該數字再出棧,求該數字序列的出棧序列是否合法?
這題在劍指offer中是面試題31。
思路:1.出棧結果儲存在佇列 order中(也可以用輔助棧)
2.按元素順序,將元素push進入棧,
3.每push1個元素,即檢查是否與佇列首部元素相同,若相同則彈出佇列首元素,彈出棧頂元素,直到兩元素不同結束
4.若最終棧為空,說明序列合法,否則不合法
整體複雜度o(n)
#include
#include
#include
class
checkordervalid}if
(!s.
empty()
)// s不空說明還有元素,即序列不合法
return
false
;return
true;}
};intmain()
else
return0;
}
5.把字串轉換成整數
把字串轉換成整數
思路:看題目似乎很簡單,但是如果考慮清楚輸入的可能性,**量還是挺多的。
#include
long
long
strtointcore
(const
char
* str,
bool minus)
;enum status
;int g_nstatus = kvalid;
intstrtoint
(const
char
* str)if(
*str !=
'\0'
) num =
strtointcore
(str, minus);}
return
(int
)num;
}long
long
strtointcore
(const
char
* digit,
bool minus)
digit++;}
else}if
(*digit ==
'\0'
) g_nstatus = kvalid;
return num;
}// ********************測試**********************
void
test
(const
char
* string)
intmain
(int argc,
char
* ar**)
6.求陣列中第k大的數(二叉堆)
乙個未排序的陣列,求其中第k大的值。 leetcode215題
乙個陣列中求第k大,只要將前k大的值存入堆中,最小堆會自動調整,始終保證堆頂為堆中最小值,使用top即求得第k大值。
#include
#include
主要是std::priority_queue<
int, std::vector<
int>
, std::greater<
int>
> q;最小堆
class
arraykthheap
else
if(q.
top(
)< nums[i])}
return q.
top();
}};int
main()
7.求動態陣列中位數
劍指offer面試題41,leetcode295
設計乙個資料結構,該資料結構動態維護一組資料,且支援如下操作:
1.新增元素:void addnum(int num),將整型num新增至資料結構中。
2.返回資料的中位數:double findmedian返回其維護的資料的中位數
中位數定義
1.若資料個數為奇數,中位數是該組數排序後中間的數。【1,2,3】->2
2.若資料個數為偶數,中位數是該組數排序後中間的兩個數字的平均值。【1,2,3,4】->2.5
思路:最大堆的堆頂是堆中最大的,最小堆的堆頂是堆中最小的,最大堆的堆頂《最小堆的堆頂
動態新增資料到最大最小堆中:需要兩個堆大小差距不超過1,新增的數加入到較少的堆中
堆頂相加/2即為中位數
插入時間複雜度nlogn,得到中位數複雜度n
劍指offer面試演算法題
1.長度為n的陣列裡面的元素都在0 n 1之間,找出第乙個重複的數字 思路 從頭到尾依次遍歷,如果當前的值a i i,如果a i a a i 那麼需要把a a i 位置上的值與a i 作交換 把對的值放在對的位置 之後繼續判斷此時的a i 位置沒有移動 如果a i a a i 證明對的位置上有對的元...
面試演算法題
前幾天,一好友去筆試,有一題 現在有1000個蘋果,和10個箱子,如何把這1000個蘋果裝在這10個箱子裡,才能使不管任何數量 1 1000 的蘋果,都能一次給出?當時,我們都想,出題這人。今天,在想移位的時候,突然想到了,這絕對是二進位制數的變種。分析 1000個蘋果,最接近1024,轉化為2進製...
面試演算法記錄
1.親和數問題 求500萬以內的所有親和數 如果兩個數a和b,a的所有真因數之和等於b,b的所有真因數之和等於a,則稱a,b是一對親和數。例如220和284,1184和1210,2620和2924。思路 220 1 2 4 71 142 sum 284 284 1 2 4 5 10 11 20 22...