劍指offer第二版 面試題10(java)

2021-09-12 10:54:56 字數 1615 閱讀 7525

面試題10:斐波那契數列

題目一:

寫乙個函式,輸入n,求斐波那契數列的第n項。

定義:

(分段函式)

f(n)= 0    if n=0

f(n) = 1   if n=1

f(n) = f(n-1) + f(n-2)   if n>1

可用遞迴的方式,但在遞迴呼叫層級太多時,會導致呼叫棧溢位,且在此題中,遞迴方法有很多重複的計算

使用自下而上的迴圈實現**

public class q10 

public static long fibonacci(int n) else

return f1;

} }}

擴充套件:矩形覆蓋——用8個2×1的小矩形無重疊地覆蓋乙個2×8的大矩形,總共有多少種方法

先把2×8的覆蓋方法記為f(8),用第乙個1×2的小矩形去覆蓋大矩形的最左邊時,有兩個選擇(橫/豎)

當豎著放時,右邊還剩2×7的區域,此時記為f(7)

當橫著放時:若放在左上角,則右下角必須也橫著放乙個1×2的小矩形,此外還剩乙個2×6的區域,記為f(6)

因此f(8) = f(7) + f(6) 

可看出,此時依舊是斐波那契數列

擴充套件部分:

1. 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。

斐波那契數列

2. 乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。

方法:

用f(n)表示青蛙跳上n階台階的跳法數,青蛙一次性跳上n階台階的跳法數,

f(0)=1;

當n = 1時,只有一種跳法,即1階跳:f(1) =  1;

當n = 2時,有兩種跳法,一階跳和二階跳:f(2) = f(1)+f(0) = 2;

當n  =3時,有三種跳法,第一次跳出一階後,後面還有f(3-1)中跳法;第一次跳出二階後,後面還有f(3-2)中跳法;第一次跳出三階後,後面還有f(3-3)種跳法:f(3)= f(2)+f(1)+f(0) = 4

當n= n時,共有n種跳法方式,第一次跳出一階後,後面還有fib(n-1)種跳法;第一次跳出二階後,後面還有fib(n-2)種跳法,第一次跳出n階後,後面還有fib(n-n)種跳法。

f(n) = f(n-1)+f(n-2)+f(n-3)+……+f(n-n)=f(0)+f(1)+f(2)+…….+f(n-1)

又因為f(n-1)=f(0)+f(1)+f(2)+……+f(n-2)

兩式相減得:f(n)-f(n-1)=f(n-1) → f(n) = 2*f(n-1)     n >= 2

遞迴等式如下:

劍指offer第二版 面試題6(java)

面試題6 從尾到頭列印鍊錶 題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值 鍊錶的結點定義如下 public class listnode 注意 面試中,如果打算修改輸入的資料,最好先問好是否資料是允許修改的 思路 1.遍歷順序從頭到尾,列印順序從尾到頭,第乙個結點最開始被訪問,但是最...

劍指offer第二版 面試題8 java

題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標 分析 情況 一 有右子樹,這時只需要把其右孩子作為下乙個遍歷的 並不是要找的 節點,然後沿著該節點的左子樹 如果有的話 出發,直到遇到葉子節點,那麼該葉子節...

劍指offer第二版 面試題9(java)

面試題9 用兩個棧實現佇列 題目描述 方法 兩個棧 stack1 stack2 插入時,直接放入stack1 刪除時,直接彈出pop2中的物件 如果pop2為空,則先將pop1中的物件放入stack2中,再從stack2裡pop第乙個 如 依次放入stack1中1 2 3,在彈出並放入stack2中...