1. 用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

  1. 示例 1
  2. 输入:
  3. ["CQueue","appendTail","deleteHead","deleteHead"]
  4. [[],[3],[],[]]
  5. 输出:[null,null,3,-1]
  6. 示例 2
  7. 输入:
  8. ["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
  9. [[],[],[5],[2],[],[]]
  10. 输出:[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<>(); }

      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());
      

      } return b.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),可以用于下一步的计算,并减少重复计算
      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;
      }
      }