leetcode 2026-02-28 每日一练 - 连接连续二进制数字

leetcode 2026-02-28 每日一练 - 连接连续二进制数字
Austoin题目描述
LeetCode 1680. 连接连续二进制数字
给你一个整数 n,请你将 1 到 n 的二进制表示连接起来,并返回连接结果对应的十进制数字对 10⁹ + 7 取余的结果。
示例:
- 输入:
n = 3 - 输出:
27 - 解释:二进制表示中,
1、2和3分别是"1"、"10"和"11",连接起来是"11011",对应十进制27
解题思路
核心思想
将 1 到 n 的二进制表示依次连接,相当于:
- 对于每个数字
i,先将当前结果左移i的二进制长度位 - 然后将
i加到结果中 - 每次操作后对
10⁹ + 7取余
位运算技巧
- 获取二进制长度:使用
bits.Len(uint(i))获取数字i的二进制位数 - 左移操作:
ans << len相当于将ans乘以2^len - 连接操作:
ans << len | i相当于将i追加到ans的二进制表示后面
示例演示
以 n = 3 为例:
i = 1:len = 1,ans = (0 << 1 | 1) % mod = 1(二进制:1)i = 2:len = 2,ans = (1 << 2 | 2) % mod = 6(二进制:110)i = 3:len = 2,ans = (6 << 2 | 3) % mod = 27(二进制:11011)
代码实现
1 | func concatenatedBinary(n int) (ans int) { |
核心细节
bits.Len():返回表示数字所需的最少位数
bits.Len(1) = 1(1需要 1 位)bits.Len(2) = 2(10需要 2 位)bits.Len(3) = 2(11需要 2 位)bits.Len(4) = 3(100需要 3 位)
位运算组合:
ans<<len | ians<<len:将当前结果左移,为新数字腾出空间| i:将新数字i追加到末尾
取余时机:每次操作后立即取余,防止整数溢出
复杂度分析
- 时间复杂度:
O(n log n),遍历n个数字,每次计算二进制长度需要O(log i)时间 - 空间复杂度:
O(1),只使用常数额外空间
总结
这道题的关键点:
- 理解二进制连接的本质:左移 + 或运算
- 使用
bits.Len()高效获取二进制位数 - 及时取余避免溢出
- 位运算比字符串拼接效率更高













