剑指offer题解合集——Week1day6

剑指offerWeek1

周六:用两个栈实现队列

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

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

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<int> 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 11, 2将A栈所有元素放入B栈,然后B栈栈顶返回,再把B栈元素装回A栈
queue.pop(); // returns 12将A栈所有元素放入B栈,然后B栈栈顶探出,再把B栈元素装回A栈
queue.empty(); // returns false2判断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

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值