20200225
题目 :用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
思路 : 需要注意的是,栈2每次要保证为空,才能将栈1中的元素存储。
code
class CQueue{
private Stack<Integer> stack1;
private Stack<Integer> stack2;
public CQueue(){
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void appendTail(int value){
stack1.push(value);
}
public int deletHead(){
if(stack1.isEmpty() && stack2.isEmpty())
return -1;
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}
题目 :斐波那契数列
写一个函数,输入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。
思路 :建立一个数组,动态规划。
code:
class Solution {
public int fib(int n) {
if(n==0) return 0;
if(n==1) return 1;
int[] dp = new int[n+1];
dp[1] = 1;
for(int i=2;i<=n;i++){
dp[i]= (dp[i-1] + dp[i-2]) % 1000000007;
}
return dp[n];
}
}
题目 :青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2
输出:2
示例 2:
输入:n = 7
输出:21
思路 :和斐波那契数列相似。
code
class Solution {
public int numWays(int n) {
if(n == 0) return 1;
if(n == 1) return 1;
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
for(int i=2;i<=n;i++ ){
dp[i]= (dp[i-1]+dp[i-2]) % 1000000007;
}
return dp[n];
}
}