华为上机真题 2022猴子爬山

Posted Linux猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为上机真题 2022猴子爬山相关的知识,希望对你有一定的参考价值。

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、题目描述

1.1 输入描述

1.2 输出描述

1.3 测试样例

1.3.1 示例 1

1.3.2 示例 2

二、解题思路

三、代码实现

四、时间复杂度


一、题目描述

猴子爬山,经过一个有 N 阶台阶的阶梯,猴子有个习惯,每次只能跳 1 阶台阶或者 3 阶台阶,求猴子通过 N 个台阶有多少种不同的跳跃方式?

1.1 输入描述

输入只有一个整数 N (0 < N < 50),表示台阶的数量。

1.2 输出描述

输出一个数字,表示多少种跳跃方式。

1.3 测试样例

1.3.1 示例 1

输入

50

输出

122106097

1.3.2 示例 2

输入

3

输出

2

提示:斐波拉契数量的非递归解法,否则会爆掉

二、解题思路

本题比较简单,是一道菲波那切数列问题,假设 dp[ i ] 表示 i 个台阶有 dp[ i ] 中跳跃方式,那么:

dp[ i ] = dp[i - 1] + dp[i - 3]

跳第 i 个台阶是从 i - 1 和 i - 3 个台阶跳过去的(因为每次跳 1 个或 3 个台阶),所以跳 i 个台阶的跳跃方式是跳 i - 1 个和 i - 3 台阶跳跃方式的和。

注意:跳小于 3 个台阶的情况。

三、代码实现

代码实现如下所示。

#include <iostream>

using namespace std;

int main()

    int n;
    while (cin>>n) 
        if (n <= 2)   // 处理特殊情况
            cout<<1<<endl;
            continue;
         else if (n == 3) 
            cout<<2<<endl;
            continue;
        
        int dp[55];
        dp[1] = 1; dp[2] = 1; dp[3] = 2;
        for (int i = 4; i <= n; ++i)  // 迭代处理斐波那契数列
            dp[i] = dp[i - 1] + dp[i - 3];
        
        cout<<dp[n]<<endl;
    
    return 0;

四、时间复杂度

时间复杂度:O(n)

在上述代码中,只需要一次遍历即可计算出有多少种跳跃方式,所以时间复杂度为 O(n)。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


以上是关于华为上机真题 2022猴子爬山的主要内容,如果未能解决你的问题,请参考以下文章

华为机试真题 C++ 实现猴子爬山

华为机试真题 C++ 实现猴子爬山

华为OD机试真题 Java 实现猴子爬山

华为OD机试 - 猴子爬山(Java) | 机试题+算法思路+考点+代码解析 2023

猴子爬山—递推法

华为上机真题 2022玩牌高手