剑指offer刷题记录

# 面试题9:用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

算法思想:一个队列用两个栈进行操作,队列是先进先出,栈是后进先出、先进后出型数据机构。
1,push操作: 元素进入stack1以前,需要把stack2中的元素依次push回stack1,才运行stack1 push新元素进来. pop操作: 先从栈1依次弹出到stack2,然后弹出栈2顶部的元素。整个过程就是一个队列的先进先出
2,但是在交换元素的时候需要判断两个栈的元素情况:
“进队列时”,队列中是不是还有元素,若有,说明栈2中的元素不为空,此时就先将栈2的元素倒回到栈1 中,保持在“进队列状态”。
“出队列时”,将栈1的元素全部弹到栈2中,保持在“出队列状态”。
所以要做的判断是,进时,栈2是否为空,不为空,则栈2元素倒回到栈1,出时,将栈1元素全部弹到栈2中,直到栈1为空。

class Solution
{
public:
    void push(int node) {
        while (!stack2.empty()){
            stack1.push(stack2.top());
            stack2.pop();
        }
        stack1.push(node);
    }

    int pop() {
        if (stack2.empty()){
            while (! stack1.empty()){
                stack2.push(stack1.top());
                stack1.pop();
            }
        }
        if (stack2.empty())
            return -1;
        int head = stack2.top();
        stack2.pop();

        return head;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

面试题10: 斐波那契数列

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39
算法思路:典型的递归算法,但是递归算法本质是在调用栈,因存在大量重复计算容易导致内存溢出 。换一种思想,为了防止大量重复计算,那就把之前的结果保存下来。
算法1:使用迭代法,用fibMin1和fibMin2保存计算过程中的结果,并复用起来。

class Solution {
public:
    int Fibonacci(int n) {
    if (n == 0) return 0;
       else if (n == 1) return 1;

       int fibMin2 = 1, fibMin1 = 0, fibN = 0;
       for (unsigned int i = 2; i <= n; ++i){
           fibN = fibMin1 + fibMin2;
           fibMin1 = fibMin2;
           fibMin2 = fibN;
       }

       return fibN;
    }
};

算法2:

class Solution {
public:
    int Fibonacci(int n) {
    if (n == 0) return 0;
       else if (n == 1) return 1;

       int fibMin2 = 1, fibMin1 = 0;
       while(--n){
           fibMin2 += fibMin1;
           fibMin1 = fibMin2 - fibMin1;
       }
       return fibMin2;
    }
};

还有其他算法思路,比如动态规划、矩阵幂。笔者知识有限,暂不论述。

你可能感兴趣的:(算法)