我是靠谱客的博主 端庄流沙,最近开发中收集的这篇文章主要介绍笔试题——变态跳台阶,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

思考:在台阶数少的时候,可以手动计算一下跳台阶的跳法。

台阶数 = 1时,

1 总共1种

台阶数 = 2时,

1 + 1, 2 总共2种

台阶数 = 3时,

1 + 1 + 1, 1 + 2,  2 + 1, 3 总共4种

台阶数 = 4时,

1 + 1 + 1 + 1, 1 + 1 + 2, 1 + 2 + 1,  2 + 1 + 1, 2 + 2, 3 + 1, 1 + 3, 4 总共8种

另台阶数为1时的跳法为f(1), 台阶数为2时的跳法为f(2), 台阶数为3时的跳法为f(3),以此类推,台阶数为n时的跳法为f(n)。

f(1) = 1; f(2) = 2; f(3) = 4; f(4) = 8...

可以找到以下规律,

f(1) = 1

f(2) = f(1) + 1 = 1 + 1 = 2

f(3) = f(2) + f(1) + 1 = 2 + 1 + 1 = 4

f(4) = f(3) + f(2) + f(1) + 1 = 4 + 2 + 1 + 1 =8

可以另f(0) = 1, 能够发现以下规律

f(1) = f(0)

f(2) = f(1) + f(0) = 1 + 1 = 2

f(3) = f(2) + f(1) + f(0) = 2 + 1 + 1 = 4

f(4) = f(3) + f(2) + f(1) + f(0) = 4 + 2 + 1 + 1 =8

以此类推,可以得出

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

编程书写情况和运行结果如下所示,

class Solution {
public:
    int jumpFloorII(int number) {
        vector<int> f(number + 1);
        f[0] = 1;
        f[1] = 1;
        for(int i = 2; i <= number; i++) {
            f[i] = 0;
            for(int j = 0; j < i; j++) {
                f[i] += f[j];
            }
        }
        return f[number];
    }
};

以上代码测试结果,运行时间:2ms 占用内存:480K

当然,此题还有更优解法

例如,把f(n) = f(n - 1) + f(n - 2) + f(n - 3) + ... + f(2) + f(1) + f(0)继续优化

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

f(n) = f(n - 1) + f(n - 1) = 2 * f(n - 1)

当n = 1,f(1) = 1;

当n > 1, f(n) = f(n - 1) + f(n - 1) = 2 * f(n - 1)

编程书写情况和运行结果如下所示,

class Solution {
public:
    int jumpFloorII(int number) {
        if(number == 1) {
            return 1;
        }
        else {
            return 2 * jumpFloorII(number - 1);
        }
    }
};

以上代码测试结果,运行时间:4ms 占用内存:476K

最后

以上就是端庄流沙为你收集整理的笔试题——变态跳台阶的全部内容,希望文章能够帮你解决笔试题——变态跳台阶所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部