1. 程式人生 > >第1題 變態跳臺階【劍指Offer程式設計題】

第1題 變態跳臺階【劍指Offer程式設計題】

b# 前言
這是一個新的部分,主要是刷劍指offer上的程式設計題,記錄自己的解法,如果看到比較讚的解法,也會放出來,共同學習。

題目描述

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

自己的解法

思路

f(n) 代表的是n個臺階有一次1,2,…n階的 跳法數。

  1. n = 1時
    只有1種跳法,f(1) = 1
  2. n = 2時
    會有兩個跳得方式,一次1階或者2階,這回歸到了問題(1) ,f(2) = f(2-1) + f(2-2)
  3. n = 3時
    會有三種跳得方式,1階、2階、3階,
    那麼就是第一次跳出1階後面剩下:
    f(3-1);第一次跳出2階,剩下f(3-2);第一次3階,那麼剩下f(3-3)
    因此結論是f(3) = f(3-1)+f(3-2)+f(3-3)
  4. n = n時
    會有n中跳的方式,1階、2階…n階,得出結論:
    f(n) = f(n-1)+f(n-2)+…+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + … + f(n-1)

解法

public class JumpFloorIISolv {

    /**
     * 一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。
     * 求該青蛙跳上一個n級的臺階總共有多少種跳法。
     * @param target
     * @return
     */
    public int JumpFloorII
(int target) { // 1. 宣告階數陣列 int jft[] = new int[target + 1]; //第i項表示,青蛙跳到當前臺階有多少中跳法 // 2. 特殊情況處理 if (target < 0){ return 0; }else if (target == 0){ return 1; }else if (target == 1){ return 1; }else if (target == 2
){ return 2; } // 3. 計算階數 // 3.1 前幾個階數 jft[0] = 1; jft[1] = 1; jft[2] = 2; // 3.2 後面的階數 for(int i = 3; i <= target; ++i){ // 階數的計算類似斐波拉契數列 for(int j = 0; j < i; ++j){ jft[i] += jft[j]; } } return jft[target]; } }

別人的解法

思路

每個臺階都有跳與不跳兩種情況(除了最後一個臺階),最後一個臺階必須跳。所以共用2^(n-1)種情況。

解法

return  1<<--number;

向大佬低頭,在下服了。。。

參考資料

  1. 變態跳臺階

廣告時間

我的個人微信公眾號變成八腳貓,喜歡的小夥伴可以新增一下,不定期分享有趣的文章