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

leetcode 1680. Concatenation of Consecutive Binary Numbers(连接连续的二进制数)

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:

Input: n = 1
Output: 1
Explanation: “1” in binary corresponds to the decimal value 1.
Example 2:

Input: n = 3
Output: 27
Explanation: In binary, 1, 2, and 3 corresponds to “1”, “10”, and “11”.
After concatenating them, we have “11011”, which corresponds to the decimal value 27.

把1~n的二进制数从左到右连接起来(像字符串连接那样),拼成的十进制数是多少(取模后)。
mod = 109+7

思路:

这是一个二进制数操作的问题。
首先是把1~n转为二进制数,然后像字符串连接那样连接它们,然后转为十进制数,每转一个数取一次模。

问题就出在1~n怎么转成二进制数,怎么连接,怎么再转为十进制数。

其实最终反正是十进制数,那直接把1~n的十进制数相加不就好了,
问题是每相加一次需要向左移位,才能加下一个。
那么要移多少位呢?
比如2 是10,需要左移2位,4是100,需要左移3位。

怎么计算需要移的位数?
两种方法:
一是用以2为底的log计算,比如log(2)=1,需要左移log(2)+1位,
4也是一样,左移log(4)+1=3位。
二是利用2的幂一定满足 i & (i-1) = 0这个条件,每满足一次,bit位+1,
比如2, 先是1 & (1-0) =0, bit=1, 然后2&(2-1)=0,bit++变为2, 4&(4-1)=0, bit++变为3

所以,思考的关键在于将二进制数的拼接和转十进制数的问题 转化为左移bit位之后再直接加十进制数。

用log计算左移位数:

public int concatenatedBinary(int n) {
    long res = 0;
    int mod = 1000000007;
    
    for(int i = 1; i <= n; i++) {
        int bitCnt = (int)(Math.log(i) / Math.log(2)) + 1;
        res = (((res << bitCnt) % mod) + i) % mod;
    }
    
    return (int)res;
}

用 i & (i-1) 计算bit位数:

public int concatenatedBinary(int n) {
    long res = 0;
    int mod = 1000000007;
    int bitCnt = 0;
    
    for(int i = 1; i <= n; i++) {
        if((i & (i-1)) == 0) bitCnt ++;
        res = (((res << bitCnt) % mod) + i) % mod;
    }
    
    return (int)res;
}

相关文章:

  • Python数据分析之时间序列的处理
  • 【PHP】如何搭建服务器环境 原生篇 | Ubuntu 18.04 + PHP8.1 + MySQL5.7 + Nginx 1.4
  • 【c语言】数据在内存中的存储
  • 数据结构考试必须要掌握的重点知识
  • 进程管理4——进程优先级
  • 外网访问内网80端口【内网穿透】
  • Android性能优化技术,在大厂中为何这么看重?进大厂必学好
  • 基于自建数据集【海底生物检测】使用YOLOv5-v6.1/2版本构建目标检测模型超详细教程
  • 水平分表之基因法
  • Gorm笔记
  • 抽空做了个“胃肠镜”,唠唠嗑
  • 现在工作是不是很难找?
  • Colmap算法pipeline
  • QCC51XX---TwsTopology_Init(goals分析)
  • 新概念英语第2册-第01课笔记
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • C++类的相互关联
  • happypack两次报错的问题
  • iOS 系统授权开发
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • JSDuck 与 AngularJS 融合技巧
  • js操作时间(持续更新)
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Less 日常用法
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Mithril.js 入门介绍
  • php ci框架整合银盛支付
  • react-native 安卓真机环境搭建
  • Redis 中的布隆过滤器
  • 动态规划入门(以爬楼梯为例)
  • 关于Flux,Vuex,Redux的思考
  • 将 Measurements 和 Units 应用到物理学
  • 微信小程序开发问题汇总
  • 异常机制详解
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • Semaphore
  • ​flutter 代码混淆
  • # Apache SeaTunnel 究竟是什么?
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #QT项目实战(天气预报)
  • #考研#计算机文化知识1(局域网及网络互联)
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (4) PIVOT 和 UPIVOT 的使用
  • (9)目标检测_SSD的原理
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (转)Scala的“=”符号简介
  • ./configure,make,make install的作用
  • .Family_物联网
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .net反编译的九款神器
  • .net实现头像缩放截取功能 -----转载自accp教程网