一、题目描述
一天一只顽猴想去从山脚爬到山顶,途中经过一个有个N个台阶的阶梯,但是这猴子有一个习惯: 每一次只能跳1步或跳3步,试问猴子通过这个阶梯有多少种不同的跳跃方式?
二、输入描述
输入只有一个整数N(0<N<=50)此阶梯有多少个阶梯。
三、输出描述
输入只有一个整数N(0<N<=50)此阶梯有多少个阶梯。
四、解题思路
题目要求计算猴子通过一个有N个台阶的阶梯时,有多少种不同的跳跃方式,每次只能跳1步或跳3步。
我们可以使用递归的方式来解决这个问题。
具体步骤如下:
- 读取输入的整数N,表示阶梯的个数;
- 检查输入的有效性,如果N不在范围0<N<=50之内,输出错误提示并结束程序;
- 调用calculation函数计算猴子跳跃的方式数,并将结果输出;
calculation函数的实现如下:
- 如果剩余的台阶数小于3,即只剩一个或两个台阶,那么只有一种跳跃方式,返回1。
- 对于剩余的台阶数大于等于3的情况,我们可以将问题拆分为两种情况:
- 跳一步:猴子跳过一个台阶,剩余的台阶数减1,递归调用calculation函数计算剩余台阶的跳跃方式数;
- 跳三步:猴子跳过三个台阶,剩余的台阶数减3,递归调用calculation函数计算剩余台阶的跳跃方式数;
- 将跳一步和跳三步的方式数相加,即为总的跳跃方式数,返回结果。
该算法使用递归的方式计算猴子跳跃阶梯的方式数。每次递归将问题拆分为两种情况,跳一步和跳三步,并将它们的结果相加。
算法的时间复杂度为O(2n),其中n为台阶的个数。每次递归调用都会分成两个子问题,因此递归树的节点数为2n。需要注意的是,该算法存在重复计算的情况,可以通过动态规划或记忆化搜索进行优化。
五、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int input = sc.nextInt();
if(input<=0 || input > 50){
System.out.println("请输入0到50之间的数字");
return;
}
System.out.println(calculation(input));
}
private static int calculation(int step){
//只剩一个台阶了
if (step < 3){
return 1;
}
//剩下的场景都需要分成当前跳1步或者跳3步
return calculation(step -1) + calculation( step -3);
}
六、效果展示
🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。