剑指offer题解合集——Week1day6

剑指offerWeek1

文章目录

  • 剑指offerWeek1
    • 周六:用两个栈实现队列
      • AC代码
      • 思路:
      • 部分模拟
  • 剑指offerWeek1
    • 周六:斐波那契数列
      • AC代码
      • 思路:

周六:用两个栈实现队列

题目链接:用两个栈实现队列

请用栈实现一个队列,支持如下四种操作:

push(x) – 将元素x插到队尾;
pop() – 将队首的元素弹出,并返回该元素;
peek() – 返回队首元素;
empty() – 返回队列是否为空;
注意:

你只能使用栈的标准操作:push to top,peek/pop from top, size 和 is empty;
如果你选择的编程语言没有栈的标准库,你可以使用list或者deque等模拟栈的操作;
输入数据保证合法,例如,在队列为空时,不会进行pop或者peek等操作;
数据范围
每组数据操作命令数量 [0,100]
。

样例
MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);
queue.peek();  // returns 1
queue.pop();   // returns 1
queue.empty(); // returns false

AC代码

class MyQueue {
public:
    stack a, b;
    /** Initialize your data structure here. */
    MyQueue() {
        
    }
    
    /** Push element x to the back of queue. */
    void push(int x) {
        a.push(x);
    }
    
    /** Removes the element from in front of queue and returns that element. */
    int pop() {
        while (a.size() > 1) b.push(a.top()), a.pop();
        int x = a.top();
        a.pop();
        while (b.size()) a.push(b.top()), b.pop();
        return x;
    }
    
    /** Get the front element. */
    int peek() {
        while (a.size() > 1) b.push(a.top()), a.pop();
        int x = a.top();
        while (b.size()) a.push(b.top()), b.pop();
        return x;
    }
    
    /** Returns whether the queue is empty. */
    bool empty() {
        return a.empty();
    }
};

思路:

整体思路

牢记栈和队列的特性
栈:先进后出,类似子弹装载
队列:先进先出

因此,用两个栈模拟队列的行为
- 入队:正常入栈
- 出队:由于在栈中,先进的元素会最后一个出,而队列需要先出,因此,队列弹出元素时,弹出队首元素,那么只需要把A栈中所有元素原封不动装入到B中,然后从B中弹出栈顶,然后其余元素再弹回A栈,即可
- 查看队首元素:参考出队操作
- 判断是否为空:查看栈是否为空

部分模拟

样例:

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);
queue.peek();  // returns 1
queue.pop();   // returns 1
queue.empty(); // returns false
操作 A栈 描述
queue.push(1); 1 将1放入A栈中
queue.push(2); 1, 2 将2放入A栈中
queue.peek(); // returns 1 1, 2 将A栈所有元素放入B栈,然后B栈栈顶返回,再把B栈元素装回A栈
queue.pop(); // returns 1 2 将A栈所有元素放入B栈,然后B栈栈顶探出,再把B栈元素装回A栈
queue.empty(); // returns false 2 判断A栈是否为空

剑指offerWeek1

周六:斐波那契数列

题目链接:斐波那契数列

输入一个整数 n
 ,求斐波那契数列的第 n
 项。

假定从 0
 开始,第 0
 项为 0
。

数据范围
0≤n≤39
样例
输入整数 n=5 

返回 5

AC代码

class Solution {
public:
    int Fibonacci(int n) {
        int a = 0, b = 1;
        while (n -- )
        {
            int c = a + b;
            a = b, b = c;
        }
        
        return a;
    }
};

思路:

公式:第三个元素等于前两个元素之和(从第三个元素开始),特别的,第一个元素为0,第二个元素为1

你可能感兴趣的:(剑指offer,算法,剑指offer,leetcode,c++)