面试题10:斐波那契数列 题目要求: 求斐波那契数列的第n项的值.f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) n>1 思路:使用循环从下往上计算数列. 考点:考察对递归和循环的选择.使用递归的代码通常比循环简洁,但使用递归时要注意一下几点:1.函数调用的时间和空间消耗:2.递归中的重复计算:3.最严重的栈溢出.根据斐波那契数列递归形式定义很容易直接将代码写成递归,而这种方式有大量重复计算,效率很低. 解法比较: 解法3,4将问题数学化,借助数学工具的推导,从根本上减低时…
剑指Offer - 九度1387 - 斐波那契数列2013-11-24 03:08 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.斐波那契数列的定义如下: 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=70). 输出: 对应每个测试案例, 输出第n项斐波那契数列的值. 样例输入: 3 样例输出: 2 题意分析: 斐波那契数列的定义: f[1] = 1, f[2] = 1 f[n] = f[n - 1] + f[…
面试题9.斐波拉契数列 题目: 输入整数n,求斐波拉契数列第n个数. 思路: 一.递归式算法: 利用f(n) = f(n-1) + f(n-2)的特性来进行递归,代码如下: 代码: long long Fib(unsigned int n) { if(n<=0) return 0; if(n==1) return 1; return Fib(n-1) + Fib(n-2); } 缺陷: 当n比较大时递归非常慢,因为递归过程中存在很多重复计算. 二.改进思路: 应该采用非递归算法,保存之前的计算结…
  题目描述:   大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).假设n<=39.   解题思路:   斐波那契数列:0,1,1,2,3,5,8........ 总结起来就是:第一项是0,第二项是1,后续第n项为第n-1项和第n-2项之和.   用公式描述如下:   看到这个公式,非常自然的可以想到直接用递归解决.但是这里存在一个效率问题,以求f(10)为例,需要先求出前两项f(9)和f(8),同样求f(9)的时候又需要求一次f(8),这样…
题目:斐波那契数列 考点:递归和循环 题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39. 法一:递归法,不过递归比较慢,会超时,所以不考虑 举个小点的例子,n=4,看看程序怎么跑的:     Fibonacci(4) = Fibonacci(3) + Fibonacci(2);                     = Fibonacci(2) + Fibonacci(1) + Fibonacci(1) + Fibona…
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 题目分析 我们都知道斐波那契可以用递归,但是递归重复计算的部分太多了(虽然可以通过),但是这道题更应该用动态规划来做, 动态规划的特点是:最优子结构.无后效性.子问题重叠.话不多说,直接上代码 代码 function Fibonacci(n) { // write code here. let f = 0, g = 1; while (n--) { g += f; f = g - f; } re…
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1).假设 n≤39 解题思路: 斐波拉契数列:1,1,2,3,5,8--,总结起来就是第一项和第二项的值均为1,后续的第n项的值为(n-1)与(n-2)项值的和. 公式总结为: 由以上公式不难看出,本题可以直接用递归方式进行解决,但是,会出现一个严重的效率问题.以f(8)为例子,若想求出f(8)的值需要先知道f(7)和f(6)的值,同样,若想知道f(7)则需要知道f(6)和f…
面试题 10. 斐波那契数列 题目一:求斐波那契数列的第n项 题目描述:求斐波拉契数列的第n项 写出一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项.斐波拉契数列定义如下: C++ 实现 /* 斐波拉契数列 */ #include <iostream> using namespace std; /* 递归实现 */ long long Fibonacci1( unsigned int n ) { if ( n <= 1 ) { return(n); } return(Fib…
****感觉都可以针对斐波那契写一个变形题目的集合了****** 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution { public: int rectCover(int number) { ) ; ||number==) return number; )+rectCover(number-); } };…
个人答案: #include"iostream" #include"stdio.h" #include"string.h" using namespace std; typedef long long ll; ; ll fib[MAXN]; ll Fibonacci(int n) { ) return fib[n]; )+Fibonacci(n-); } int main() { int n; memset(fib,-,sizeof(fib));…
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 编程思想 知道斐波拉契数列的规律即可. 编程实现 class Solution { public: int Fibonacci(int n) { int preNum = 1; int prePreNum = 0; int result = 0; if(n == 0) return 0; if(n == 1) return 1; for(int i = 2;i <= n;…
题目:写一个函数,输入n,求斐波那契数列的第n项. package Solution; /** * 剑指offer面试题9:斐波那契数列 * 题目:写一个函数,输入n,求斐波那契数列的第n项. * 0, n=1 * 斐波那契数列定义如下:f(n)= 1, n=2 * f(n-1)+f(n-2), n>2 * @author GL * */ public class No9Fibonacci { public static void main(String[] args) { System.out…
10- I. 斐波那契数列 方法一 Top-down 用递归实现 def fibonacci(n): if n <= 0: return 0 if n == 1: return 1 return fibonacci(n-1) + fibonacci(n-2) 不过这种方法在leetcode上超时了. 方法二 Bottom-up 用循环实现 class Solution: def fib(self, n: int) -> int: if n <= 0: return 0 if n == 1…
书中方法一:递归,这种方法效率不高,因为可能会有很多重复计算. public long calculate(int n){ if(n<=0){ return 0; } if(n == 1){ return 1; } return calculate(n-1) + calculate(n-2); } 书中方法二:更好的方法是将这个斐波那契数列的计算理解成动态规划,第n步的结果依赖于第n-1步和第n-2步的结果,状态转移方程很容易写出来. public long calculate2(int n){…
题目 写一个函数,输入 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 提示: 0…
问题描述 写一个函数,输入 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  …
题目一:写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列的定义如下: { n=; f(n)={ n=; { f(n-)+f(n-) n>; 斐波拉契问题很明显我们会想到用递归来解决: long long Fibonacci(unsigned int n) { ) ; ) ; ) )+Fibonacci(n-); } 这道题用递归解决思路很清晰,代码很简单,那么问题来了 根据马克思辩证主义思想,往往简单的思路会带来较大的 时间空间开销.在这种递归计算的过程中往往会计算很多 重复的项,比如…
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 编程思想 因为n级台阶,第一步有n种跳法:跳1级.跳2级.到跳n级跳1级,剩下n-1级,则剩下跳法是f(n-1)跳2级,剩下n-2级,则剩下跳法是f(n-2)所以f(n)=f(n-1)+f(n-2)+...+f(1)因为f(n-1)=f(n-2)+f(n-3)+...+f(1)所以f(n)=2*f(n-1)=2^(n-1) 编程实现 class Solution { publ…
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 编程思想 对于本题,前提只有 一次 1阶或者2阶的跳法.a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)c.由a和b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2) d.然后通过实际的情况可以得出:只有一阶的时候 f(1)…
题目描述 思路分析 Java代码 代码链接 题目描述  大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). 思路分析 递归的思路,会出现很多重复的操作,效率低下: 可以从下往上计算,首先根据f(0)和f(1)计算出f(2),再根据f(1)和f(2)计算出f(3),一次类推,可以计算出第n项.算法的时间复杂度为O(n); Java代码 public class Offer010_1 { public static void main(Strin…
题目:请实现一个函数,输入一个整数.输出该数二进制表示中1的个数. 比如把9表示成二进制是1001,有2位是1.因此假设输入9.该函数输出2. 1.可能引起死循环的解法 这是一道非常主要的考察二进制和位运算的面试题. 题目不是非常难.面试官提出问题之后,我们非常快形成一个主要的思路:先推断证书二进制表示中最右边一位是不是1.接着把输入的证书右移一位,此时原来处于从右边树起的第二位被移到最后一位,再推断是不是1.这样没移动一位,知道整个整数变成0为止.如今的问题变成怎么推断一个整数的最右边是不是1…
最近在用Java刷剑指offer(第二版)的面试题.书中原题的代码采用C++编写,有些题的初衷是为了考察C++的指针.模板等特性,这些题使用Java编写有些不合适.但多数题还是考察通用的算法.数据结构以及编程思想等,与语言本身无太大关系.因此在选择编程语言时,我还是选择了Java.好吧,主要是我C++不怎么会,仅仅是曾经学过俩月,使用Java顺手一些.后续可能再用Python刷一遍. 面试题3  数组中重复的数字 题目一:找出数组中重复的数字 描述:在长度为n的数组里所有数字都在0~n-1范围内…
一.题目 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39. 二.思路 序号:                  0  1   2   3  4   5  6  7   8    9   10 斐波那契数列 :     0  1   1   2  3   5  8 13  21  34  55 斐波那契数列 除了前两个数0和1外,后面的元素为前面两个元素之和. 三.代码 1.解答代码 public class Fibonacci { public int…
// 面试题:斐波那契数列 // 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项. #include <iostream> using namespace std; // ====================方法1:递归==================== //注意这种递归方法虽然看起来很简单,但是由于压入栈和弹出,会存在栈溢出的可能,而且效率特别慢,且n越大效率越慢 long long Fibonacci_Solution1(unsigned int n)//…
很长一段时间里,我都非常疑惑:“我写的技术文章不差啊,有内容的同时还很有趣,不至于每篇只有区区几十个人读啊?为什么有些内容简单到只有一行注册码的文章浏览量反而轻松破万?”这样的疑惑如鲠在喉啊!写技术博客做分享的人,有几个真心实意的说只写给自己看的?这无非是写出来后没人看的自我安慰(不好意思,我就属于这种人,/(ㄒoㄒ)/~~). 但就在昨天晚上,我终于恍然大悟:技术交流群里有一个叫涛涛的小伙伴用几句通俗易懂的道理就点醒了我:“高深的文章,看懂的人少,适合高层:像只有注册码的文章,反而是大众所需,…
题目:写一个函数,输入n,求斐波那契数列的第n项.斐波那契数列的定义如下: 1.效率很低效的解法,挑剔的面试官不会喜欢 使用递归实现: public class Fibonacci { public long getNum(int n){ if(n<=0){ return 0; }else if(n==1){ return 1; }else{ return getNum(n-1)+getNum(n-2); } } } 我们不难发现在这颗树中有很多的节点是重复的,而且重复的节点数会随着n的增大而急…
面试题9:斐波那契数列及其变形(跳台阶.矩形覆盖) 提交网址: http://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tpId=13&tqId=11160 参与人数:7267  时间限制:1秒  空间限制:32768K 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项 Fibonacci(int n). 分析: 用递归会TLE,因为有不少地方进行了重复计算,改为循环即可解决(迭代法…
一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时候,大多都会用Fibonacci作为例子,因此我们会对这种解法烂熟于心: public static long FibonacciRecursively(uint n) { ) { ; } ) { ; } ) + FibonacciRecursively(n - ); } 上述递归的解法有很严重的效…
一 题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二 效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时候,大多都会用Fibonacci作为例子,因此我们会对这种解法烂熟于心 #include "stdio.h" #include <iostream> using namespace std; int Fibs(int n) { if (0 == n) { ; } else if…
题目: 现在要求输入一个整数n,请你输出斐波那契数列的第n项. 斐波那契数列的定义: f(0)=0;f(1)=1; f(n)=f(n-1)+f(n-2) 思路: 1.递归: 根据递推公式来实现 优点:代码简单,易懂 缺点: 效率低:函数递归调用过程中需要不断分配栈空间,且不断地入栈出栈,代码执行效率低: 栈溢出:当递归层级太多时,会超出栈容量,导致栈溢出: 复杂度高:递归调用存在大量的重复计算,时间复杂度以n的指数递增. 2.循环: 从下往上计算(动态规划),克服递归出现的缺陷 3.类似问题:…