1. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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]
思路:
- 前提准备:
- A栈专门用于实现队列的尾部添加元素
- B栈用于出队操作
实现逻辑:
- 当有元素要入队时,直接在A栈进行入栈操作
当元素要出队时,则先判断B栈是否含有元素:
- 如果有,B栈进行弹栈;
- 如果没有,
- 查看A栈是否含有元素
- 如果有,将A栈中所有元素进行弹栈到B栈之中
- 然后返回B栈栈顶元素
```java
class CQueue {
Stack
a,b; public CQueue() { a = new Stack<>(); b = new Stack<>(); }
- 查看A栈是否含有元素
public void appendTail(int value) { a.push(value); }
public int deleteHead() { if(!b.isEmpty()) return b.pop(); if(a.isEmpty()) return -1; while(!a.isEmpty()){
b.push(a.pop());2. 斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(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
思路:
个人思路:
- 关于斐波那契第一印象想到的是递归,但是使用递归,需要求取递归单独求取f(n-1)和f(n-2),这样就会出现大量重复操作
class Solution { public int fib(int n) { // 使用递归会进行多次重复的计算 if(n==0) return 0; if(n==1) return 1; long num = fib(n-1) + fib(n-2); int res = (int)(num%1000000007); return res; } }
- 关于斐波那契第一印象想到的是递归,但是使用递归,需要求取递归单独求取f(n-1)和f(n-2),这样就会出现大量重复操作
优秀解法:
- 使用循环,并在循环过程中用两个变量记录f(n-1)和f(n-2),可以用于下一步的计算,并减少重复计算
class Solution { public int fib(int n) { int a=0, b=1, sum = 0; for(int i=0;i<n;i++){ sum = (a+b)%1000000007; a = b; b = sum; } return a; } }
- 使用循环,并在循环过程中用两个变量记录f(n-1)和f(n-2),可以用于下一步的计算,并减少重复计算
