JavaScript算法系列之-----------------变态跳台阶(JS实现)

题目描述

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

思路:其实和跳台阶思路很像,

(1)跳一级台阶 :

1             一种

(2)跳二级台阶 :

11/2        两种

(3)跳三级台阶 :

先跳一级还有两级台阶同情况(2)  记作=>    1 (2)

先跳两级还有一级台阶同情况(1)  记作=>    2 (1)

          先跳三级台阶情况                             记作=>    3

把这三种情况加起来就是跳三级台阶的一共可能

(2)+(1)+1

(4)跳四级台阶 :

先跳一级还有三级台阶同情况(3)  记作=>    1 (3)

先跳两级还有两级台阶同情况(2)  记作=>    2 (2)

          先跳三级还有一级台阶同情况(1)  记作=>    3 (1)

          先跳四级台阶情况                             记作=>    4

把这两种情况加起来就是跳四级台阶的一共可能

(4)+(3)+(2)+(1)+1

(5)跳五级台阶 :

先跳一级还有四级台阶同情况(4)  记作=>    1 (4)

先跳两级还有三级台阶同情况(3)  记作=>    2 (3)

          先跳三级还有二级台阶同情况(2)  记作=>    3 (2)

先跳四级还有一级台阶同情况(1)  记作=>    4 (1)

把这两种情况加起来就是跳五级台阶的一共可能

(5)+(4)+(3)+(2)+(1)+1

...

以此类推

我的思路实现:

function jump(n){
    if(n<=2){
        return n;
    }
    if(n>2){
        var arr = [1,2];
        for(var i=3;i<=n;i++){
            var res=0;
            for(var j=0;j<arr.length;j++){
                res += arr[j]
            }
            arr.push(res+1)
        }
        return arr[n-1]
    }
}

 

然而看了大牛的代码:

function jumpFloorII(number)
{
    return 1<<(--number);
}

你就说你服不服吧

  

<< :

比如 var temp=14<<2
那么temp为56
因为:
变量14的二进制表示为00001110,按位左移2位后二进制为00111000,转为十进制为56

其实推到推到会发现规律的,2的幂次方相关,于是就有了

function jumpFloorII(number)
{
    return Math.pow(2,number-1)
}

  

换种思路:

因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级
跳1级,剩下n-1级,则剩下跳法是f(n-1)
跳2级,剩下n-2级,则剩下跳法是f(n-2)
所以f(n)=f(n-1)+f(n-2)+...+f(1)
因为f(n-1)=f(n-2)+f(n-3)+...+f(1)

所以f(n)=2*f(n-1)

实现:

function jumpFloorII(number)
{
    if(number==1||number==2){
        return number
    }
    return 2*jumpFloorII(number-1)
}

  

原文地址:https://www.cnblogs.com/manru75/p/10452013.html

时间: 2024-07-31 15:32:35

JavaScript算法系列之-----------------变态跳台阶(JS实现)的相关文章

JavaScript算法系列之-----------------链表反转(JS实现)

题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 之前一直对JS实现链表理解不了,被算法大牛指点了一下豁然开朗. function ListNode(x){ this.val = x; this.next = null; } 在JS中,this.val代表当前节点的值,this.next指向下一个节点,若this.next为null(对象),则说明该节点为链表的最后一个节点. PS:把下一个节点赋值给当前对象的next属性,通过这样的方式连接. 通过代码: function

剑指offer源码系列-变态跳台阶

题目1389:变态跳台阶 时间限制:1 秒内存限制:32 兆特殊判题:否提交:1906解决:1102 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=50). 输出: 对应每个测试案例, 输出该青蛙跳上一个n级的台阶总共有多少种跳法. 样例输入: 6 样例输出: 32 解法分析: 分析:用Fib(n)表示青蛙跳上n阶台阶的跳法数,青蛙

剑指OFFER之变态跳台阶(九度OJ1389)

题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=50). 输出: 对应每个测试案例, 输出该青蛙跳上一个n级的台阶总共有多少种跳法. 样例输入: 6 样例输出: 32 解题思路: 这道题目跟之前的跳台阶大同小异,只是跳台阶的阶数从1变到了n,也就是说,不再是跳一下或者跳两下的问题,而是跳n下的问题.那么解题的思路显然还得逆向分析,我们

Javascript算法系列之快速排序(Quicksort)

Javascript算法系列之快速排序(Quicksort) 原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gist.github.com/paullewis/1981455#file-gistfile1-js 快速排序(Quicksort)是对冒泡排序的一种改进,是一种分而治之算法归并排序的风格 核心的思想就是通过一趟排序将要排序的数据分割成独立的

变态跳台阶(递归算法)

台阶的级数:1,2,3,4,5,6..... 对应的跳法:1,2,4,8,16,32.... 最终结论 在n阶台阶,一次有1.2....n阶的跳的方式时,总得跳法为: | 1 ,(n=0 ) f(n) = | 1 ,(n=1 ) | 2*f(n-1) ,(n>=2) package suanfati; /* * 变态跳台阶 * 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级. * 求该青蛙跳上一个n级的台阶总共有多少种跳法. * 递归算法 */ public class Hig

[剑指Offer]2.变态跳台阶

题目 一仅仅青蛙一次能够跳上1级台阶,也能够跳上2级--它也能够跳上n级. 求该青蛙跳上一个n级的台阶总共同拥有多少种跳法. 思路 用Fib(n)表示青蛙跳上n阶台阶的跳法数,设定Fib(0) = 1: 当n = 1 时. 仅仅有一种跳法,即1阶跳,即Fib(1) = 1; 当n = 2 时. 有两种跳的方式,一阶跳和二阶跳,即Fib(2) = Fib(1) + Fib(0) = 2; 当n = 3 时.有三种跳的方式,第一次跳出一阶台阶后,后面还有Fib(3-1)中跳法,第一次跳出二阶台阶后.

[剑指OFFER] 斐波那契数列- 跳台阶 变态跳台阶 矩形覆盖

跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. class Solution { public: int jumpFloor(int number) { if(number == 1) return 1; if(number == 2) return 2; int n1 = 1; int n2 = 2; int rtn = 0; for(int i = 3; i <= number; i++) { rtn = n1 + n2; n1 = n2;

(原)剑指offer变态跳台阶

变态跳台阶 时间限制:1秒空间限制:32768K 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析一下明天是个斐波那契数列,我们一步一步退出其通项公式. 设台阶数为n, 总跳法为jumps n          jumps 1 1 2 2 3 4 4 8 5 16 现在猜测其通项公式为 fbonicc(n) = 2 * fbonicc(n - 1) 列出4的全部跳法 5的全部跳法 1111 1111 (1) 2  11

跳台阶问题(递归、动态规则、变态跳台阶)

题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析:青蛙每次只有一阶或者两阶两种跳法,那么: 假设第一次跳的是一阶,那么剩下的n-1个台阶,跳法是f(n-1) 假设第一次跳的是两阶,那么剩下的n-2个台阶,跳法是f(n-2) 由上面两种假设可得:f(n) = f(n-1) + f(n-2) 由实际情况可知:f(1) = 1,f(2) = 2 最终得出的是一个斐波那契数列: |  1,n = 1 f(n)   =       |  2, n =