[leetcode/lintcode 題解] Google 面試題:用棧實現佇列
輸入:
push(1)
pop()
push(2)
push(3)
top()
pop()
輸出:
1
2
2
例2:
輸入:
push(1)
push(2)
push(2)
push(3)
push(4)
push(5)
push(6)
push(7)
push(1)
輸出:
[]
解題思路
先考慮只有一個棧的時候,由於棧的先入後出特性FILO,棧中的元素的順序是反的,我們無法直接訪問棧底的元素。但是當把1號棧中所有元素依次彈出並壓入到2號棧中,2號棧頂的元素就變成了原來1 號棧的棧底,即正序。所以我們要提取元素時,只需從2號棧提取即可。
但是由於2號棧中棧頂元素是最先加入佇列的元素,所以只有當2號棧為空時,才能將1號棧中所有元素加入到2號棧中。
舉例說明:
首先我們有一個主要棧stack1:[1,2,3) ,以下所有棧的表示方式中,圓括號 ')' 均為棧頂。 那麼stack1的出棧順序為3-2-1,其中 1 為我們要找到的元素,也就是隊首。- 每個元素最多會別push,pop,move一次,每個操作的均攤時間複雜度為O(1)。
- 假設一共操作了N次push,空間複雜度為O(N)。
public class MyQueue {
public MyQueue() {
// do intialization if necessary
}
/*
* @param element: An integer
* @return: nothing
*/
public void push(int element) {
stack1.push(element);
}
/*
* @return: An integer
*/
public int pop() {
if (stack2.isEmpty()) {
move();
}
return stack2.pop();
}
/*
* @return: An integer
*/
public int top() {
if (stack2.isEmpty()) {
move();
}
return stack2.peek();
}
// 將1號棧中的元素移動到2號棧中
private void move() {
while (! stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
private Stack<Integer> stack1 = new Stack<>();
private Stack<Integer> stack2 = new Stack<>();
}
更多題解參考:九章官網solution
相關推薦
[leetcode/lintcode 題解] Google 面試題:用棧實現佇列
正如標題所述,你需要使用兩個棧來實現佇列的一些操作。 佇列應支援push(element),pop() 和 top(),其中pop是彈出佇列中的第一個(最前面的)元素。
[leetcode/lintcode 題解] Google面試題:萬用字元匹配
判斷兩個可能包含萬用字元“?”和“*”的字串是否匹配。匹配規則如下: \'?\' 可以匹配任何單個字元。
[leetcode/lintcode 題解] Google面試題:搜尋二維矩陣 II
寫出一個高效的演算法來搜尋m×n矩陣中的值,返回這個值出現的次數。 這個矩陣具有以下特性:
[leetcode/lintcode 題解] Google面試題:資料流滑動視窗平均值
給出一串整數流和視窗大小,計算滑動視窗中所有整數的平均值。 線上評測地址:領釦題庫官網
[leetcode/lintcode 題解] Google面試題:字串解碼
給出一個表示式 s,此表示式包括數字,字母以及方括號。在方括號前的數字表示方括號內容的重複次數(括號內的內容可以是字串或另一個表示式),請將這個表示式展開成一個字串。
[leetcode/lintcode 題解] Google 面試題:包裹黑色畫素點的最小矩形
一個由二進位制矩陣表示的圖,0 表示白色畫素點,1 表示黑色畫素點。黑色畫素點是聯通的,即只有一塊黑色區域。畫素是水平和豎直連線的,給一個黑色畫素點的座標 (x, y) ,返回囊括所有黑色畫素點的矩陣
[leetcode/lintcode 題解] Google 面試題:最接近零的子陣列和
給定一個整數陣列,找到一個和最接近於零的子陣列。返回第一個和最右一個指數。你的程式碼應該返回滿足要求的子陣列的起始位置和結束位置。
[leetcode/lintcode 題解] 微軟面試題:公平索引
現在給你兩個長度均為N的整數陣列 A 和 B。 當(A[0]+...A[K-1]),(A[K]+...+A[N-1]),(B[0]+...+B[K-1]) 和 (B[K]+...+B[N-1])四個和值大小相等時,稱索引K是一個公平索引。也就是說,索引K 可以使得A, B 兩個陣列被
[leetcode/lintcode 題解] Amazon面試題:安排課程
你需要去上n門九章的課才能獲得offer,這些課被標號為 0 到 n-1 。 有一些課程需要“前置課程”,比如如果你要上課程0,你需要先學課程1,我們用一個匹配來表示他們: [0,1]
[leetcode/lintcode 題解] Apple面試題:二叉樹的最大深度
給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的距離。
[leetcode/lintcode 題解] Facebook面試題:電話號碼的字母組合
給一個不包含0和1的數字字串,每個數字代表一個字母,請返回其所有可能的字母組合。
[leetcode/lintcode 題解] LinkedIn面試題:房屋染色
這裡有n個房子在一列直線上,現在我們需要給房屋染色,分別有紅色藍色和綠色。每個房屋染不同的顏色費用也不同,你需要設計一種染色方案使得相鄰的房屋顏色不同,並且費用最小,返回最小的費用。
[leetcode/lintcode 題解] 微軟面試題:K個最近的點
給定一些 points 和一個 origin,從 points 中找到 k 個離 origin 最近的點。按照距離由小到大返回。如果兩個點有相同距離,則按照x值來排序;若x值也相同,就再按照y值排序。
[leetcode/lintcode 題解] Facebook 面試題:和大於S的最小子陣列
給定一個由 n 個正整陣列成的陣列和一個正整數 s ,請找出該陣列中滿足其和 ≥ s 的最小長度子陣列。如果無解,則返回 -1。
[leetcode/lintcode 題解] Amazon 面試題:排序矩陣中的從小到大第k個數
在一個排序矩陣中找從小到大的第 k 個整數。 排序矩陣的定義為:每一行遞增,每一列也遞增。
【LeetCode/LintCode】Facebook面試題:子集 II
給定一個可能具有重複數字的列表,返回其所有可能的子集。 線上評測地址:
【LeetCode/LintCode】題解丨 Google面試題:單詞搜尋 II
給出一個由小寫字母組成的矩陣和一個字典。找出所有同時在字典和矩陣中出現的單詞。一個單詞可以從矩陣中的任意位置開始,可以向左/右/上/下四個相鄰方向移動。一個字母在一個單詞中只能被使用一次。且字典中不存在重
【LeetCode/LintCode】丨Google面試題:N皇后問題
n皇后問題是將n個皇后放置在n*n的棋盤上,皇后彼此之間不能相互攻擊(任意兩個皇后不能位於同一行,同一列,同一斜線)。
【LeetCode】C++ :簡單題 - 棧 232. 用棧實現佇列
技術標籤:LeetCodeleetcode棧佇列資料結構 232. 用棧實現佇列 難度簡單261 請你僅使用兩個棧實現先入先出佇列。佇列應當支援一般佇列的支援的所有操作(push、pop、peek、empty):
leetcode之棧:[232] 用棧實現佇列
題目 請你僅使用兩個棧實現先入先出佇列。佇列應當支援一般佇列的支援的所有操作(push、pop、peek、empty):