11天刷剑指offer——JavaScript版——第二天

文章目录

  • 7、斐波那契数列
        • 题目描述
        • 思路
        • 代码
  • 8、跳台阶
        • 题目描述
        • 思路
        • 代码
  • 9、变态跳台阶
        • 题目描述
        • 思路
        • 代码
  • 10、矩形覆盖
        • 题目描述
        • 思路
        • 代码
  • 11、二进制中1的个数
        • 题目描述
        • 思路一
        • 代码
        • 思路二
        • 代码
  • 12、数值的整数次方
        • 题目描述:
        • 思路一
        • 代码
        • 思路二
        • 代码
        • 思路三
        • 代码

7、斐波那契数列

题目描述

大家都知道斐波那契数列,现在要求输入一个整数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、跳台阶

题目描述

一只青蛙一次可以跳上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、变态跳台阶

题目描述

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

思路

递归的思想,结合跳台阶的例子,可以理解为跳1个台阶有一种方法,跳2个台阶可以有两种跳法,而跳3个台阶则就是跳一个台阶和跳2个台阶方法总和再加1,跳四个台阶就是跳一个台阶、跳2个台阶方法和跳三个台阶方法总和再加1……如此递归。
思路:f(1)=1,f(2)=2,f(3)=1+f(2)+f(1)…
f(3)可以这样考虑:分跳3(本身值直接+1),跳1,跳2三种情况,跳1之后还剩f(3-1)种跳法,跳2之后还有f(3-2)种跳法,所以f(3)可以等于这三种分法相加。类推f(n)=1+f(1)+f(2)+…+f(n-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、矩形覆盖

题目描述

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

思路

这个和青蛙跳台阶是一个道理,这里换种方式实现。
f(n) = f(n-1)+f(n-2), f(1) = 1; f(2) = 2;

代码

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=0;
    for(var i = 3 ; i <= number ; i++){
        result = n1 + n2;
        n1 = n2;
        n2 = result;
    }
    return result;
}

11、二进制中1的个数

题目描述

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

思路一

普通的字符串方法。

代码

function NumberOf1(n)
{
  /* 无符号右移运算符由三个大于号(>>>)表示,它将无符号 32 位数的所有数位整体右移。对于正数,无符号右移运算的结果与有符号右移运算一样。 */
    if(n<0){
        n = n>>>0;
    }
    //toString() 方法可把一个逻辑值转换为字符串,并返回结果。z转换二进制
    var charCode = n.toString(2);
    var count = 0;
    for(var i = 0 ; i <= charCode.length - 1 ; i++){
        if(charCode[i] == 1){
            count++;
        }
    }
    return count;
}

思路二

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

代码

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

12、数值的整数次方

题目描述:

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

思路一

用Math对象的pow方法

代码

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

思路二

用**运算符即可——乘方运算符

代码

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

思路三

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

代码

function Power(base, exponent)
{
    // write code here
    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;
}

你可能感兴趣的:(前端面试宝典)