首页 > 其他 > 详细

b_lc_连接连续二进制数字(连接相当于左移然后异或)

时间:2020-12-07 10:54:59      阅读:19      评论:0      收藏:0      [点我收藏+]

给你一个整数 n(1<=1e5),请你将 1 到 n 的二进制表示连接起来,并返回连接结果对应的 十进制 数字对 10^9+7 取余的结果。

思路:暴力

class Solution:
    def concatenatedBinary(self, n: int) -> int:
        ans=‘‘
        mod=int(1e9+7)
        for i in range(n+1):
            ans=ans+bin(int(i)%mod)[2:]
        return int(ans,2)%mod

二进制思路:二进制数a、b的连接相当于a左移\(cnt_2(b)\)位,在异或上b,公式为:x=(x<<cnt(i))+i),而只有i是2的次幂数,左移的位数才会增加1,否则它会以当前最大2的次幂数的位数为基准

class Solution:
    def concatenatedBinary(self, n: int) -> int:
        x,k,mod=0,0,int(1e9+7)
        for i in range(1,n+1):
            if (i&(i-1))==0: k+=1
            x=((x<<k)|i)%mod;
        return x

b_lc_连接连续二进制数字(连接相当于左移然后异或)

原文:https://www.cnblogs.com/wdt1/p/14095812.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!