Nowcoder java-变态跳台阶

题目

(题目来自牛客网站)在这里插入图片描述

思路1.青蛙角度

1.青蛙角度
关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:f(n)表示n个台阶有多少种跳法
f(1) = 1
f(2) = f(2-1) + f(2-2) //f(2-1) 表示2阶一次跳1阶的次数。f(2-2) 表示2阶一次跳2阶的次数。
f(3) = f(3-1) + f(3-2) + f(3-3) //f(3-1) 表示3阶一次跳1阶的次数。f(3-2) 表示3阶一次跳2阶的次数。f(3-3)表示一次跳3阶的次数。

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

说明:
n = 1时,只有1种跳法,f(1) = 1
n = 2时,两种方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2)= f(1) + f(0)
n = 3时,三种方式,1阶、2阶、3阶,f(3) = f(3-1) + f(3-2)+ f(3-3)= f(2) + f(1) + f(0)
……
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)
6) 由以上已经是一种结论,但是为了简单,我们可以继续简化:
f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)
f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) + f(n-1) = f(n-1) + f(n-1)
可以得出:f(n) = 2f(n-1)
7) 得出最终结论,在n阶台阶,一次有1、2、…n阶的跳的方式时,总得跳法为:
-1 ,(n=0 )
f(n) = 1 ,(n=1 )
2
f(n-1),(n>=2)

思路2.台阶角度

2.台阶角度
n个台阶就有n块木板,最后一块木板是青蛙到达的位子, 必须存在,其他 (n-1) 块木板可以任意选择是否存在,则每个木板有跳和不跳在两种选择,(n-1) 块木板 就有 [2^(n-1)] 种跳法,可以直接得到结果。

代码

import java.util.Scanner;
public class JumpFloorII {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int target = input.nextInt();
        System.out.println("跳上一个" + target + "级的台阶总共有"
                + jumpFloor(target) + "种跳法");
    }
	//青蛙角度
    //只有一种方法
    public static int jumpFloor(int target) {
        if (target <= 0) {
            return -1;
        } else if (target == 1) {
            return 1;
        } else {
            return 2 * jumpFloor(target - 1);//2*f(n-1)
        }
    }
    //台阶角度
    // 第一种做法
    //    public static int jumpFloor(int target) {
    //        if (target <= 0) return 0;
    //        return (int) Math.pow(2, target - 1);//除了最后一个台阶一定要跳,剩下的n-1阶台阶都有两   
                                                   //种选择:跳和不跳,所以共有2^(n-1)种方法
    //    }


    //第二种做法
    //public static int jumpFloor(int target) {
    //		if (target <= 0) return 0;
    //		if (target == 1) return 1;
    //		int a = 1;
    //		int b = 2;
    //		for (int i = 2; i <= target; i++) {
    //			b = 2 * a;//除了最后一个台阶一定要跳,剩下的n-1阶台阶都有两种选择:跳和不跳
    //			a = b;
    //		}
    //		return b;
    //	}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值