前n个数字种的二进制数中的1的个数

给定一个非负整数 n ,请计算 0n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。

示例 1:

输入: n = 2
输出: [0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10

示例 2:

输入: n = 5
输出: [0,1,1,2,1,2]
解释:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101

两种方法,一种就是对每一个数字进行处理,另一种就是使用动态规划

public int[] countBits(int n){
    // 大小为n+1是因为还有0
    int[] res = new int[n+1];
    for(int i = 0;i < n+1;i++){
        res[i] = getOne(i);
    }
    return res;
}
public int getOne(int n){
    int res = 0;
    while(n != 0){
        // 这一步是可以将二进制中最后一个1转化为0
        n = n&(n-1);
        res ++;
    }
    return res;
}

代码解析:我们想要知道一个二进制数中1的个数,我们除了对每一位的数字进行判断以外,我们还可以使用Brian Kernighan 算法,这个算法当n&(n)-1的时候,得到的结果是将n最低位的1转化为0

例如:

    n = 3;
    n的二进制表示:11
    n-1的二进制表示:10
    n&(n-1) = 10
    10相较11,最右边的1变成了0
    如果再次转化
    10&01 = 00

public int[] countBits(int n){
    // 大小为n+1是因为还有0
    int[] res = new int[n+1];
    res[]  = 0;
    for(int i = 1;i < n+1;i++){
        if(i%2 == 0){
            res[i] = res[i>>1];
        }else{
            res[i] = res[i-1] + 1;
        }
    }
    return res;
}

代码解析:通过对二级制数的分析,我们可以发现,奇数中二进制数种1的个数为当前奇数前一个偶数中个数+1(因为和偶数只是最低位多了一个1),偶数中个数和将当前偶数右移一位的偶数是一样的(因为多的一位是最低为,一定为0)

Brian Kernighan 算法:n&(n-1) = n将最右边的1转化为0得到的结果

二进制中1的个数的规律:奇数等于前一个偶数数目加一,偶数和当前偶数右移一位相同。

Original: https://www.cnblogs.com/foldn/p/16025580.html
Author: foldn
Title: 前n个数字种的二进制数中的1的个数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579738/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java根据文档注释生成API说明文档

    API注释 通过 IDEA生成API说明文档 (1) 路径”Tools”->”Generate JavaDoc…”…

    Java 2023年5月29日
    091
  • SpringBoot 解决跨站脚本漏洞(XSS)问题

    SpringBoot 解决跨站脚本漏洞(XSS)问题 解决方案 步骤如下: 1、添加maven依赖 在 pom.xml文件中,增加如下依赖: <dependency> …

    Java 2023年5月30日
    0100
  • Spring自动配置实现原理详解

    详情参阅系列:https://blog.csdn.net/f641385712/category_10035396.html Note: Spring中的配置分为Full模式和Li…

    Java 2023年5月30日
    094
  • Dart 初探 (一)

    前言 Dart 是 Google 为 Flutter 开发的一款用于 网页编程的语言,其类似于 Javascript,也是一种面向对象的语言,但其采用 基于类的编程,语法风格接近C…

    Java 2023年6月7日
    0104
  • Redis学习

    1.1 下载安装 环境Centos7.x https://redis.io/download 安装make(可选) yum -y install make 安装gcc(可选) yu…

    Java 2023年6月5日
    078
  • 改变mysql默认字符集为utf8

    问题:在使用mysql时,使用php插入数据库、查询数据库信息会出现乱码 解决:修改mysql配置文件,在其配置文件中加入一下代码 init_connect=’SET collat…

    Java 2023年6月8日
    099
  • 抵达心之自由

    如水涟漪,如树伫立,如草柔韧。 自由来自智慧。 你眼前所见即为真,所不见亦为真。假从何来?假并不存在于事物中,而是存在于标准中。 挣脱了标准的枷锁,就获得了第一层自由; 当深明生命…

    Java 2023年6月9日
    086
  • shiro中常用的对象和方法

    一.配置类中常用的对象和方法 1.ShiroFilterFactoryBean()对象:通过创建的该对象调用setSecurityManager方法去关联DefaultWebSec…

    Java 2023年6月9日
    0104
  • [游戏引擎中文版]CatSystem2最新中文支持版

    最近有的论坛希望能自己开发GAL 而不是一味 汉化GAL 就想找程序猿帮忙。 借此机会 我推出游戏引擎中文支持版,希望大家能开发属于自己的GALGAME! 上次就为大家介绍一个引擎…

    Java 2023年5月29日
    085
  • javaWeb知识点大集合!!!

    pom文件: 4.0.0 org.example javaweb_maven 1.0-SNAPSHOT war UTF-8 1.7 1.7 com.github.pagehelpe…

    Java 2023年6月8日
    096
  • MSSQL·FOR XML PATH语法转义尖括号解决方案

    阅文时长 | 0.14分钟字数统计 | 225.6字符主要内容 | 1、引言&背景 2、示例及解决方案 3、声明与参考资料『MSSQL·FOR XML PATH语法转义尖括…

    Java 2023年6月5日
    093
  • 远程注册表读取,与多线程池的应用.

    界面如下: 一般用在域环境下,读取客户机注册的配制信息. 主要代码如下: private void button1_Click(object sender, System.Even…

    Java 2023年5月30日
    077
  • 分布式锁实现方案最全解读

    前言 对多线程有所了解的朋友一般都会熟悉一个概念:锁。 在多线程并发场景下,要保证在同一时刻只有一个线程可以操作某个业务、数据或者变量,通常需要使用加锁机制。比如 synchron…

    Java 2023年6月7日
    090
  • java: You aren’t using a compiler supported by lombok, so lombok will not work and has been disabled

    idea 报错:java: You aren’t using a compiler supported by lombok, so lombok will not wo…

    Java 2023年5月29日
    066
  • 分析 java.util.Hashtable 源码

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    082
  • 万字+28张图带你探秘小而美的规则引擎框架LiteFlow

    大家好,今天给大家介绍一款轻量、快速、稳定可编排的组件式规则引擎框架LiteFlow。 一、LiteFlow的介绍 LiteFlow官方网站和代码仓库地址 在每个公司的系统中,总有…

    Java 2023年6月16日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球