【华为机试】猴子爬山问题

题目描述:

一天一只顽猴想要从山脚爬到山顶 途中经过一个有n个台阶的阶梯,但是这个猴子有个习惯,每一次只跳1步或3步 试问?猴子通过这个阶梯有多少种不同的跳跃方式

输入描述

输入只有一个这个数n 0 < n < 50 此阶梯有多个台阶

输出描述

有多少种跳跃方式

示例1

输入
50
输出
122106097

示例2

输入
3
输出
2

代码

import java.util.Scanner;
public class OneStar_04 {
          
   
    public static void main(String[] args) {
          
   
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入阶梯的台阶数:");
        int n = scanner.nextInt();
        solution(n);
        // System.out.println(fun(n));
    }

    //使用循环实现,共执行n-2次循环
    private static void solution(int n) {
          
   
        int step1 = 1 , step2 = 1 , step3=2;
        //step4 用来存储最后的跳跃方式数量。
        //由于当n为1或2时只有一种跳跃方式,n大于1或2时有2种及以上的跳跃方式
        int step4 = n == 1 || n == 2 ? 1 : 2;
        //当n=3时,必定有2种跳跃方式
        //当n>3时,有大于2种跳跃方式

        /**
         * n = 1 s1 = 1
         * n = 2 s2 = 1
         * n = 3 s3 = 2
         * n = 4 s4 = 1 + 2
         * n = 5 s4 = 1 + 3
         * n = 6 s4 = 2 + 4
         * n = 7 s4 = 3 + 6
         * 
         */
        for(int i = 4 ; i <= n ; i++){
          
   
            step4 = step1 + step3;
            //观察每一种台阶数下的跳跃方式总数
            //System.out.println(step4);
            step1 = step2;
            step2 = step3;
            step3 = step4;
        }

        System.out.println(step4);
    }

    //使用递归实现,同理斐波那契数列(112358...)
    private static int fun(int n) {
          
   
        if (n == 1 || n == 2) {
          
   
            return 1;
        }
        if (n == 3) {
          
   
            return 2;
        }
        int sum = 0;
        if (n > 3) {
          
   
            sum = fun(n - 1) + fun(n - 3);
        }
        return sum;
    }

    
}
经验分享 程序员 微信小程序 职场和发展