Problem
Given an integer n
, return the decimal value of the binary string formed by concatenating the binary representations of 1
to n
in order, modulo 109 + 7
.
Example 1:
1 | Input: n = 1 |
Example 2:
1 | Input: n = 3 |
Example 3:
1 | Input: n = 12 |
Constraints:
1 <= n <= 105
Analysis
这是一道二进制字符串拼接的问题,题目给出n
,要求把[1, n]
之间的数的二进制拼接起来,最后返回十进制结果。我们先看对于某个数字k
,是怎么样拼接进去的。
- 首先我们已经有了
[1, k - 1]
这个区间中所有数字拼接好的数,假设为a
; - 然后我们需要把
k
插入进去,所以需要先把a
左移x
位,这个x
是k
的长度,然后把k
加进去
所以问题就变成了这个x
怎么求,如果每一个数都先把它从十进制转为二进制再求长度,效率会非常低下。这个x
实际上就是二进制串的长度,这个是有规律的。比如2的0次方是1,2的1次方是2,所以我们可以通过对比k-1
和k
就能够知道x
是否需要自增1。仅当需要进位的时候,这个x
才会增加。
Solution
判断x
是否需要自增的条件是(i & (i - 1))
。还需要注意每次运算后都要进行模运算防止溢出。
Code
1 | class Solution { |
Summary
这道题目是位运算的一道很好的应用题,这类题目主要是从二进制运算出发进行考察。这道题这道题目的分享到这里,谢谢您的支持!