[剑指offer]面试题9:斐波那契数列

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[剑指offer]面试题9:斐波那契数列相关的知识,希望对你有一定的参考价值。

面试题9:斐波那契数列
题目一:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下:

在这里插入图片描述
❖ 效率很低的解法,挑剔的面试官不会喜欢

代码如下:

long long fib(unsigned int n)
{
	if (n <= 0) return 0;
	if (n == 1) return 1;
	return fib(n - 1) + fib(n - 2);
}

❖ 面试官期待的实用解法

其实改进的方法并不复杂。上述递归代码之所以慢是因为重复的计算太多,我们只要想办法避免重复计算就行了。
比如我们可以把已经得到的数列中间项保存起来,如果下次需要计算的时候我们先查找一下,如果前面已经计算过就不用再重复计算了。

更简单的办法是从下往上计算,首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)……依此类推就可以算出第n 项了。很容易理解,这种思路的时间复杂度是O(n)。

实现代码如下:

#include <iostream>
using namespace std;
typedef long long LL;


LL fib(unsigned int n)
{
	int res[2] = { 0,1 };
	if (n < 2) return res[n];
	LL fibminone = 1;
	LL fibmintwo = 0;
	LL fibN = 0;
	for (unsigned int i = 2; i <= n; i++)
	{
		fibN = fibminone + fibmintwo;
		fibmintwo = fibminone;
		fibminone = fibN;
	}
	return fibN;
}

测试用例:
● 功能测试(如输入3、5、10等)。
● 边界值测试(如输入0、1、2)。
● 性能测试(输入较大的数字,如40、50、100等)。
本题考点:
● 考查对递归、循环的理解及编码能力。
● 考查对时间复杂度的分析能力。
● 如果面试官采用的是青蛙跳台阶的问题,那同时还在考查应聘者的数学建模能力。

以上是关于[剑指offer]面试题9:斐波那契数列的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode | 面试题10- I. 斐波那契数列剑指OfferPython

剑指offer面试题 10. 斐波那契数列

《剑指offer》之7-9题

剑指Offer面试题:10- I 斐波那契数列

剑指Offer面试题:10- I 斐波那契数列

剑指Offer面试题:10- I 斐波那契数列