剑指Offer每日6题(JavaScript版)--第二天

7、剑指offer–斐波那契数列

题目描述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39

思路:
俗称“兔崽子数列”,f(1)=1,f(2)=1,f(3)=f(1)+f(2)

代码:

function Fibonacci(n)
{
    if(n <= 0){
        return 0;
    }else if(n <= 2){
        return 1;
    }else{
        var result = [];
        result[1] = 1;
        result[2] = 2;
        for(var i = 3;i < n;i++){
            result[i] = result[i-1] + result[i - 2];
        }
        return result[n - 1];
    }
}

8、剑指offer–跳台阶

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

思路:
与“兔崽子数列”相似,跳1个台阶有一种方法,跳2个台阶可以有两种跳法,而跳3个台阶则就是跳一个台阶和跳2个台阶方法总和。

代码:

function jumpFloor(number)
{
    if(number <= 0){
        return 0;
    }else if(number == 1){
        return 1;
    }else if(number == 2){
        return 2;
    }else{
        var result = [];
        result[1] = 1;
        result[2] = 2;
        for(var i = 3;i <= number;i++){
            result[i] = result[i -1] + result[i - 2];
        }
        return result[number];
    }
}

9、剑指offer–变态跳台阶

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

思路:
递归的思想,结合跳台阶的例子,可以理解为跳1个台阶有一种方法,跳2个台阶可以有两种跳法,而跳3个台阶则就是跳一个台阶和跳2个台阶方法总和再加1,跳四个台阶就是跳一个台阶、跳2个台阶方法和跳三个台阶方法总和再加1……如此递归。

代码:

function jumpFloorII(number)
{
    // write code here
    if(number <= 0) return 0;
    if(number == 1) return 1;
    var tmp = 1;
    while(number > 1){
        number--
        tmp += jumpFloorII(number);
    }
    return tmp;
}

10、剑指offer–矩形覆盖

题目描述:
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

思路:
这个和青蛙跳台阶是一个道理,这里换种方式实现。

代码:

function rectCover(number)
{
    if(number <= 0) return 0;
    if(number == 1) return 1;
    if(number == 2) return 2;
    var n1 = 1;
    var n2 = 2;
    var result;
    for(var i = 3 ; i <= number ; i++){
        result = n1 + n2;
        n1 = n2;
        n2 = result;
    }
    return result;
}

11、剑指offer–二进制中1的个数

题目描述:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

思路1:普通的字符串方法。

思路2:把一个整数减去1,再和原来的整数做与运算,会把该整数最右边的一个1变为0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

代码:

//1、
function NumberOf1(n)
{
    if(n<0){
        n = n>>>0;
    }
    var charCode = n.toString(2);
    var count = 0;
    for(var i = 0 ; i <= charCode.length - 1 ; i++){
        if(charCode[i] == 1){
            count++;
        }
    }
    return count;
}

//2、
function NumberOf1(n)
{
    var count=0;
    while(n != 0){
        n = n & (n-1);
        count++;
    }
    return count;
}

12、剑指offer–数值的整数次方

题目描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

思路1:用Math对象的pow方法

思路2:用**运算符即可

思路3:先判断浮点数的正负情况,然后通过累乘的方式

代码:

//1、
function Power(base, exponent)
{
    return Math.pow(base,exponent);
}

//2、
function Power(base, exponent)
{
    return base**exponent;
}

//3、
function Power(base, exponent)
{
    if(exponent==0) return 1;
    var result=1,flag=false;
    if(exponent<0) {
        exponent=Math.abs(exponent);
        flag=true;
    }
    while(exponent>0){
        result*=base;
        exponent--;
    }
    if(flag) result=1/result;
    return result;
}

剑指Offer每日6题(JavaScript版)-系列文章参考专栏:JavaScript版剑指offer

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值