牛客网剑指offer=>数学

JZ11 二进制中1的个数

function NumberOf1(n)
{
    // write code here
    //方法一:如果n>=0,就可以用一下方法
    var res = 0;
//     while(n!=0){
//         if(n&1) ++res;
//         n>>=1;
//     }
    //但是因为有负数,需要调整一下
//     var k = 0x01;
//     while(k!=0){
//         if(k&n) ++res;
//         k<<=1;
//     }
    
    
    //方法二:对于方法一,每次0还是需要判断,可以提升一下效率,例如 val:1101000,val-1:1100111,那么val&(val-1):110000
    while(n!=0){
        ++res;
        n &= n-1;
    }
    return res;
}
module.exports = {
    NumberOf1 : NumberOf1
};

JZ12 数值的整数次方

function Power(base, exponent)
{
    // write code here
    /*
    * 1、先预处理负数
    * 2、使用二进制运算处理
    * 假设计算pow(x,6) ,6可以表示成二进制110
    * 6 = 0*pow(2,0)+1*pow(2,1)+1*pow(2,2),
    * 所以pow(x,6) = pow(x,0*pow(2,0)+1*pow(2,1)+1*pow(2,2))=pow(x,0)*pow(x,2)*pow(x,4)
    * */
    if(exponent<0){
        base = 1/base;
        exponent = -exponent;
    }
    var x = base;
    var res = 1.0;
    while(exponent!=0){
        if(exponent&1){
            res*=x;
        }
        x*=x;
        exponent>>=1;
    }
    return res;
}
module.exports = {
    Power : Power
};

JZ31 从1到n整数中1出现的次数

**从1到n整数中1出现的次数:O(logn)算法
**

function NumberOf1Between1AndN_Solution(n)
{
    // write code here
    var res = 0, base = 1,round = n;
    while(round>0){
        let weight = round%10;
        round = Math.floor(round/10);
        res+=(round*base);
        if(weight==1){
            res+=(n%base)+1;
        }else if(weight>1){
            res+=base;
        }
        base*=10;
    }
    return res;
    
}
module.exports = {
    NumberOf1Between1AndN_Solution : NumberOf1Between1AndN_Solution
};

JZ33 丑数

剑指 Offer 49. 丑数(动态规划,清晰图解)

function GetUglyNumber_Solution(index)
{
    if(index<7) return index;
    // write code here
    var a=0,b=0,c=0;
    const dp = new Array(index);
    dp[0] = 1;
    for(let i=1;i<index;i++){
        let n2 = dp[a]*2,n3 = dp[b]*3,n5 = dp[c]*5;
        dp[i] = Math.min(Math.min(n2,n3),n5);
        if(dp[i]===n2) a++;
        if(dp[i]===n3) b++;
        if(dp[i]===n5) c++;
    }
    return dp[index-1];
}
module.exports = {
    GetUglyNumber_Solution : GetUglyNumber_Solution
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值