面试问题 —— 算法题

遇到了一个青蛙上台阶的算法问题 。

 

一只小青蛙 ,一次可以跳一级台阶 ,也可以跳两级台阶 ,问这只小青蛙跳上 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)种跳法
    }

 

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