当前位置: 首页 > news >正文

位运算题目:连接连续二进制数字

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:连接连续二进制数字

出处:1680. 连接连续二进制数字

难度

5 级

题目描述

要求

给定一个整数 n \texttt{n} n,将 1 \texttt{1} 1 n \texttt{n} n 的二进制表示连接得到一个二进制数,返回连接得到的二进制数对应的十进制数对 10 9 + 7 \texttt{10}^\texttt{9} + \texttt{7} 109+7 取余的结果。

示例

示例 1:

输入: n   =   1 \texttt{n = 1} n = 1
输出: 1 \texttt{1} 1
解释:二进制的 "1" \texttt{"1"} "1" 对应十进制的 1 \texttt{1} 1

示例 2:

输入: n   =   3 \texttt{n = 3} n = 3
输出: 27 \texttt{27} 27
解释:二进制下, 1 \texttt{1} 1 2 \texttt{2} 2 3 \texttt{3} 3 分别对应 "1" \texttt{"1"} "1" "10" \texttt{"10"} "10" "11" \texttt{"11"} "11"
将它们依次连接,得到 "11011" \texttt{"11011"} "11011",对应十进制的 27 \texttt{27} 27

示例 3:

输入: n   =   12 \texttt{n = 12} n = 12
输出: 505379714 \texttt{505379714} 505379714
解释:连接结果为 "1101110010111011110001001101010111100" \texttt{"1101110010111011110001001101010111100"} "1101110010111011110001001101010111100",对应十进制的 118505380540 \texttt{118505380540} 118505380540
10 9 + 7 \texttt{10}^\texttt{9} + \texttt{7} 109+7 取余后,结果为 505379714 \texttt{505379714} 505379714

数据范围

  • 1 ≤ n ≤ 10 5 \texttt{1} \le \texttt{n} \le \texttt{10}^\texttt{5} 1n105

解法

思路和算法

由于 1 1 1 n n n 的二进制表示的连接结果可能很长,因此需要在遍历连接结果的过程中计算结果。

初始时,连接结果是 0 0 0。当遍历到整数 i i i 时,假设 1 1 1 i − 1 i - 1 i1 的连接结果对应的整数是 x x x,整数 i i i 的二进制表示有 bits \textit{bits} bits 位,则 1 1 1 i − 1 i - 1 i1 的连接结果对应的整数是将 x x x 左移 bits \textit{bits} bits 位之后加 i i i。因此,只要知道 1 1 1 n n n 的每个整数的二进制表示的位数,即可得到连接的结果对应的整数。

如果正整数 x x x 2 2 2 的整数次幂,则 x x x 的二进制表示的位数比 x − 1 x - 1 x1 的二进制表示的位数多 1 1 1,这里规定 0 0 0 的二进制表示的位数是 0 0 0。正整数 x x x 2 2 2 的整数次幂等价于 x   &   ( x − 1 ) = 0 x ~\&~ (x - 1) = 0 x & (x1)=0,因此可以在 O ( 1 ) O(1) O(1) 的时间内判断一个整数是不是 2 2 2 的整数次幂。

由此可以得到如下解法。

num \textit{num} num 表示连接结果,用 bits \textit{bits} bits 表示当前整数的二进制表示的位数,初始时 num \textit{num} num bits \textit{bits} bits 都是 0 0 0。依次遍历从 1 1 1 n n n 的每个整数,对于整数 i i i,执行如下操作。

  1. 判断 i i i 是否是 2 2 2 的整数次幂。如果 i   &   ( i − 1 ) = 0 i ~\&~ (i - 1) = 0 i & (i1)=0,则 i i i 2 2 2 的整数次幂,将 bits \textit{bits} bits 1 1 1,否则 bits \textit{bits} bits 不变。此时 bits \textit{bits} bits i i i 的二进制表示的位数。

  2. num \textit{num} num 的值更新为 ( num < < bits ) + i (\textit{num} << \textit{bits}) + i (num<<bits)+i,并将更新后的值对 1 0 9 + 7 10^9 + 7 109+7 取余。

遍历结束之后, num \textit{num} num 即为 1 1 1 n n n 的二进制表示的连接结果对应的整数。

需要注意的是,由于 n n n 的最大值是 1 0 5 10^5 105,因此 bits \textit{bits} bits 的最大值是 17 17 17 nums < < bits \textit{nums} << \textit{bits} nums<<bits 的结果可能超出 32 32 32 位整数的范围。为了避免溢出,应将 num \textit{num} num 声明为 long \texttt{long} long 型,返回结果时转成 int \texttt{int} int 型。

代码

class Solution {
    public int concatenatedBinary(int n) {
        final int MODULO = 1000000007;
        long num = 0;
        int bits = 0;
        for (int i = 1; i <= n; i++) {
            if ((i & (i - 1)) == 0) {
                bits++;
            }
            num = ((num << bits) + i) % MODULO;
        }
        return (int) num;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是给定的整数。需要遍历 n n n 个整数,每个整数的操作时间都是 O ( 1 ) O(1) O(1)

  • 空间复杂度: O ( 1 ) O(1) O(1)

相关文章:

  • python asyncio 的基本使用
  • HTTP 和 HTTPS 协议的区别及使用场景
  • Java微服务流量控制与保护技术全解析:负载均衡、线程隔离与三大限流算法
  • vue3 div 点击右键旁边出现弹窗 可做编辑删除 新增操作
  • 案例-索引对于并发Insert性能优化测试
  • 初阶数据结构--二叉树OJ训练
  • 渗透测试学习-概述
  • 搭载DeepSeek|暴雨AI教育一体机加速AI教育普及
  • # linux 设置宽容模式
  • onlyoffice 在线编辑集成
  • 【数据结构_8】栈和队列
  • Java基础——面试自我总结
  • Linux基础IO(七)之理解文件系统
  • 文心一言开发指南03——千帆大模型平台产品优势
  • 力扣每日打卡 3396. 使数组元素互不相同所需的最少操作次数(简单)
  • 【NLP】 22. NLP 现代教程:Transformer的训练与应用全景解读
  • 高速电路中的电阻、电容的选型及应用
  • SCP-Firmware安全通告:CVE-2024-11863和CVE-2024-11864
  • 数组中的第K个最大元素
  • 运行便携软件提示系统从服务器返回一个参照问题解决
  • 这5种走路姿势,藏着疾病秘密,第2种你可能也有
  • 这家企业首次签约参展进博会,为何他说“中资企业没有停止出海的步伐”
  • 上海又现昆虫新物种:体长仅1.5毫米,却是凶猛的捕食者
  • 成功卫冕!孙颖莎4比0战胜蒯曼,获澳门世界杯女单冠军
  • 第13届京都国际摄影节,14位艺术家展现东西方视角:人性
  • 解除近70家煤电厂有毒物质排放限制,特朗普能重振煤炭吗?