剑指offer 面试10题

面试10题:

题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39

 n=0时,f(n)=0 n=1时,f(n)=1 n>1时,f(n)=f(n-1)+f(n-2)

解题代码一:基于循环(推荐)

代码如下:

# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):
        # write code here
        small=0
        big=1
        if n<=0:
            return 0
        if n==1:
            return 1
        for i in range(2,n+1):
            sum_i=small+big
            small=big
            big=sum_i
        return big

解题代码二:基于递归(不太推荐,效率低,可能不能通过)

# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):
        # write code here
        if n<=0:
            return 0
        elif n==1:
            return 1
        return self.Fibonacci(n-1)+self.Fibonacci(n-2)
            

 解题思路三:还可以采用求矩阵乘方的方法,详见剑指offer P77

 

题目拓展1:跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

解题代码同上:

# -*- coding:utf-8 -*-
class Solution:
    def jumpFloor(self, number):
        # write code here
        if number==1:
            return 1
        if number==2:
            return 2
        small,big=1,2
        for i in range(2,number):
            sum_i=small+big
            small=big
            big=sum_i
        return big

 题目拓展2:变态跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

解题思路:由数学归纳法得规律。

解题代码:

# -*- coding:utf-8 -*-
class Solution:
    def jumpFloorII(self, number):
        # write code here
        if number<=0:
            return 0
        return 2**(number-1)

 

题目拓展3:矩形覆盖

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 

解题思路:这道题本质上还是斐波那契数列问题,注意分析n=0,1,2,3,...的值的情况。

解题代码:

# -*- coding:utf-8 -*-
class Solution:
    def rectCover(self, number):
        # write code here
        if number<=0:
            return 0
        if number==1:
            return 1
        if number==2:
            return 2
        small,big=1,2
        for i in range(3,number+1):
            sum_i=small+big
            small=big
            big=sum_i
        return big

 

posted @ 2018-06-15 10:03  Fintech带你飞  阅读(1470)  评论(0编辑  收藏  举报