面試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