【LeetCode刷题笔记(六十二)】 之 5620 连接二进制数字

水深无声 2023-10-07 15:18 76阅读 0赞

本文章由公号【开发小鸽】发布!欢迎关注!!!

老规矩–妹妹镇楼:

20200721223424816.JPG

一. 题目

(一) 题干

给你一个整数 n ,请你将 1 到 n 的二进制表示连接起来,并返回连接结果对应的 十进制 数字对 109 + 7 取余的结果。

(二) 示例

示例 1:

  1. 输入:n = 1
  2. 输出:1
  3. 解释:二进制的 "1" 对应着十进制的 1

示例 2:

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

示例 3:

  1. 输入:n = 12
  2. 输出:505379714
  3. 解释:连接结果为 "1101110010111011110001001101010111100"
  4. 对应的十进制数字为 118505380540
  5. 109 + 7 取余后,结果为 505379714

提示:

  1. 1 <= n <= 105

二. 题解

(一) 思路

从题目上来看,这是一个十进制转二进制,再转十进制的问题,如果按照这种思路硬做的话会比较麻烦。再仔细分析,可以得出这是一个二进制的左移问题,给出整数n,从1开始连接二进制数一直到n,我们发现,已经连接过的数在这个过程中会不断地左移,每次左移的位数都是当前整数的二进制位数, 然后加上当前的整数。因此,可以得出递推公式:

  1. res = res << 二进制位数(i) + I;

因此,可以从1开始迭代到n,得出最终的结果,不过要注意的是这种数值比较大的运算中要时刻警惕溢出的问题,首先,我们需要设定res结果为Long类型,同时在每个迭代中也要及时地取模防止溢出问题出现。

(二) 代码实现

Java:

  1. class Solution {
  2. public int concatenatedBinary(int n) {
  3. //获取每个数字转换为二进制的长度
  4. int mod = 1000000007;
  5. //二进制移位
  6. //当前的结果左移二进制的位数 + 当前的数
  7. long res = 0;
  8. for(int i = 1; i <= n; ++i){
  9. res = ((res << ten2two(i)) + i) % mod;
  10. }
  11. return (int)res;
  12. }
  13. public int ten2two(int ten){
  14. StringBuilder out = new StringBuilder();
  15. while(ten != 0){
  16. out.append(ten % 2);
  17. ten /= 2;
  18. }
  19. return out.length();
  20. }
  21. }

发表评论

表情:
评论列表 (有 0 条评论,76人围观)

还没有评论,来说两句吧...

相关阅读