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

给你一个整数 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
posted @ 2020-12-07 10:14  童年の波鞋  阅读(108)  评论(0编辑  收藏  举报