我要失业了 Day 1 剑指Offer 10-I.斐波那契数列

受疫情影响只能宅家,没有实验室的氛围完全成为一条咸鱼,小论文交给老师也没有恢复,今天开始记录剑指offer的刷题过程。

链表和二叉树不会啊,当时老师也没讲,要么就是讲的时候没听?(菜),选了看上去还行的斐波那契数列。

这道题还是比较简单的,还是有三个坑。
先看题目:
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 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

代码如下:

class Solution {
public:
    int fib(int n) {
        
        long long fn = 0;
        long long fn_2 = 0;
        long long fn_1 = 1;

        if (n == 0) fn = 0;
        if (n == 1) fn = 1;

        int i = 2;
        while(i<=n)
        {
            fn = (fn_1 + fn_2)%(1000000007);
            fn_2 = fn_1;
            fn_1 = fn;
            i++;
        }
        return fn;
    }
};

首先就是递归的思想了,就循环呗,但是要注意n要大于2,从第2项开始,因为第0项和第1项都是初始值,没有办法相加,从第二项开始,将前两项(fn_1和fn_2)的值相加作为fn的值,而后再将fn_1的值给fn_2,将fn的值给fn_1,为下一次迭代做准备,注意千万不要把顺序搞错,要不然三个值就是一样了,非常尴尬,然后要注意写循环条件,忘写的话马上就会溢出了TAT(新手还是naive)。现在说说坑在哪:
第一,要注意正确使用数据类型,避免溢出,这里用的long long类型的,但是后面模1000000007是不是就不会溢出了?一会儿试一下;
第二,在迭代的过程中就要模1000000007,不要想着最后再fn = fn%1000000007,这样的话还没来得及模就溢出了。
第三就是1e9+7是double类型的,不能直接模。
还是要多多总结,今天看看能不能再肝了,估计有点悬。

你可能感兴趣的:(我要失业了 Day 1 剑指Offer 10-I.斐波那契数列)