用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 appendTail 和 deleteHead ,分別完成在隊列尾部插入整數和在隊列頭部刪除整數的功能。(若隊列中沒有元素,deleteHead?操作返回 -1 )
?
示例 1:
輸入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
輸出:[null,null,3,-1]
示例 2:
輸入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
輸出:[null,-1,null,null,5,2]
提示:
1 <= values <= 10000
最多會對?appendTail、deleteHead 進行?10000?次調用
?思路:輔助棧,彈出操作之前,當棧2為空時將棧1的元素全部倒入棧2,然后彈出棧2頂。
class CQueue {Stack<Integer> stack1;Stack<Integer> stack2;public CQueue() {stack1 = new Stack<Integer>();stack2 = new Stack<Integer>();}public void appendTail(int value) {stack1.push(value);}public int deleteHead() {if(stack2.empty()){while (!stack1.isEmpty()) {stack2.push(stack1.pop());}}if(stack2.empty()){return -1;}return stack2.pop();}
}/*** Your CQueue object will be instantiated and called as such:* CQueue obj = new CQueue();* obj.appendTail(value);* int param_2 = obj.deleteHead();*/
寫一個函數,輸入 n ,求斐波那契(Fibonacci)數列的第 n 項。斐波那契數列的定義如下:
F(0) = 0,???F(1)?= 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契數列由 0 和 1 開始,之后的斐波那契數就是由之前的兩數相加而得出。
答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。
?
示例 1:
輸入:n = 2
輸出:1
示例 2:
輸入:n = 5
輸出:5
?
提示:
0 <= n <= 100
思路:按照式子優化空間,用幾個變量即可。
class Solution {public int fib(int n) {int a = 0, b = 1, sum;for(int i = 0; i < n; i++){sum = (a + b) % 1000000007;a = b;b = sum;}return a;}
}
一只青蛙一次可以跳上1級臺階,也可以跳上2級臺階。求該青蛙跳上一個 n?級的臺階總共有多少種跳法。
答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。
示例 1:
輸入:n = 2
輸出:2
示例 2:
輸入:n = 7
輸出:21
提示:
0 <= n <= 100
式子和上題一樣。
class Solution {public int numWays(int n) {int a = 1, b = 1, sum;for(int i = 0; i < n; i++){sum = (a + b) % 1000000007;a = b;b = sum;}return a;}
}
把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個遞增排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如,數組?[3,4,5,1,2] 為 [1,2,3,4,5] 的一個旋轉,該數組的最小值為1。??
示例 1:
輸入:[3,4,5,1,2]
輸出:1
示例 2:
輸入:[2,2,2,0,1]
輸出:0
思路:二分,注意和右端點比,不要左端點。
靈魂是如何操作相等情況。
class Solution {public int minArray(int[] numbers) {int i = 0, j = numbers.length - 1;while (i < j) {int mid = (i + j) / 2;if (numbers[mid] > numbers[j]) i = mid + 1;else if (numbers[mid] < numbers[j]) j = mid;//這一句是細節靈魂所在else j--;}return numbers[i];}
}
?