【leecode 剑指offer】连接连续二进制数字

连接连续二进制数字

给你一个整数 n ,请你将 1 到 n 的二进制表示连接起来,并返回连接结果对应的 十进制 数字对 109 + 7 取余的结果。
在这里插入图片描述

解题思路

对于第n个数和前n-1个数连接之后的数值sum,将n转成二进制字符串,假定长度为k,sum需要整体左移k个长度,就是乘以Math.pow(2,k),所以一次遍历就完成了,注意每次取余即可。

代码展示

/**
 * @param {number} n
 * @return {number}
 */
var concatenatedBinary = function(n) {
    var mod=1000000007;//模
    var res=0;
    var shift=0;//记录当前数据的二进制位数
   for(let i=1;i<=n;i++){
       if(!(i&(i-1))){//当是2的幂级数时位数加一
           ++shift;
       }
       res = (( res * Math.pow(2,shift))+ i ) % mod;//左移shift位后加上当前数,左移n位相当于乘以2的n次
   }

   return res;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值