跳台阶与变态跳台阶

第八题:跳台阶与变态跳台阶

 

1.跳台阶    

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

 

解析:根据题意,我们可以举例说明并从中找到数学规律。列举出台阶数与跳法,可得出规律类似斐波那契数列。

当然我们也可以推导出来,前提是该青蛙只能有两种跳法,一次跳一个台阶,一次跳两个台阶,那么假设我们第一次跳1个台阶,那么剩下台阶的跳法为 f(n-1),如果我们第一次跳2个台阶,那么剩下台阶的跳法为f(n-2),当剩下2个台阶时,结果为f(2) = 2,当剩下1个台阶时,结果为f(1) = 1,结论为:

          | 1,(n=1)

f(n) =  | 2,(n=2)

          | f(n-1)+f(n-2),(n>2)

 

具体实现代码如下:

 public class Solution {  //最优解  
     public int Fibonacci(int n) {    
         if(n <= 2){  //代码的鲁棒性  
             return n;    
         }    
         int first = 1;    
         int second = 2;    
         int result = 0;    
         for(int i = 3;i < n+1;i++){    
             result = first + second;      
             first = second;      
             second = result;      
         }    
         return result;   
     }    
 }  

 

2.变态跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

 

解析:有n级台阶,第一步的跳法有n种,可以一次跳一级,跳二级.....跳n级

跳1级,剩下的n-1级跳法为:f(n-1)

跳2级,剩下的n-1级跳法为:f(n-2)

得出:f(n) = f(n-1)+f(n-2)+......+f(1);

          f(n-1) = f(n-2)+f(n-3)+......+f(1);

所以:f(n) = 2f(n-1);

 

下面代码为递归解法和非递归解法

第三种是一个非常牛逼的解,借鉴其他人的解释为: 每个台阶都有跳与不跳两种情况(除了最后一个台阶),最后一个台阶必须跳。所以共用2^(n-1)中情况

 

具体实现代码如下:

/**
 *〈一句话功能简述〉<br>
 *〈变态跳台阶〉
 */
public class JumpFloorII {

    /**
     * 功能描述: <br>
     *〈递归写法〉
     */
    public int method1(int target){
        if (target <= 0){
            return -1;
        }
        if (target == 1){
            return 1;
        }else {
            return 2*method1(target - 1);
        }
    }

    /**
     * 功能描述: <br>
     *〈非递归写法〉
     */
    public int method2(int target){
        int count = 1;
        while (--target > 0){
            count *= 2;
        }
        return count;
    }

    /**
     * 功能描述: <br>
     *〈牛逼解法〉
     */
    public int method3(int target){
        return 1 << --target;
    }

}

 

NowCoder(Online Coding, Please Click)

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值