面試問題 —— 算法題

遇到了一個青蛙上臺階的算法問題 。

 

一隻小青蛙 ,一次可以跳一級臺階 ,也可以跳兩級臺階 ,問這隻小青蛙跳上 n 級臺階總共有多少種跳法 ?

 

思考

不可變因素是青蛙一次可以跳一級臺階或者一次可以跳兩級臺階 ,可變的因素是臺階有 n 級 。

分析 n 級臺階的可能性 。

No.1 :  n = 1  ( 一共一級臺階 ) 

答案:小青蛙只有一隻跳法 。

No.2 :  n = 2 (一共兩級臺階)

答案:青蛙有兩種跳法 ,一級一級跳 ,二級跳 。

No.3 : n > 2 

此時有 n 個臺階 ,假設用函數 f(n) 表示總共跳的方法數

當小青蛙第一次跳一級臺階的話 ,則剩下的 n - 1 個 臺階 ,一共有 f(n - 1) 種跳法

當小青蛙第一次跳二級臺階的話 ,則剩下的 n - 2 個臺階 ,一共有 f(n - 2) 種跳法

所以結論就是 f(n) = f( n -1 ) + f( n - 2)

 

驗證一下 ,當 n = 1 時 ,f(n) = 1; 當 n = 2 時 ,f(n) = 2。

 

代碼實現

for 循環

   private long frogJumpSteps( int n) {
        int result[] = {0, 1, 2};
        
        if (n < 3) {
            return result[n];
        }
        
        long jumpCount1 = 1;
        long jumpCount2 = 2;
        long jumpCountn = 0;
        for (int i = 3; i <= n; ++i) {
            jumpCountn = jumpCount1 + jumpCount2;
            jumpCount1 = jumpCount2;
            jumpCount2 = jumpCountn;
        }

        return jumpCountn;
    }

 

遞歸實現(感覺使用遞歸比較符合分析的流程)

   public long frogJumpSteps(int n){
        if(n < 1){ //沒有臺階 n = 0
            return 0;
        }
        if(n == 1){ //一級臺階 n = 1
            return 1;
        }
        if(n == 2){ //兩級臺階 n = 2
            return 2;
        }
        return frogJumpSteps(n-1) + frogJumpSteps(n-2); //n級臺階 : f(n-1)+f(n-2)種跳法
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章