前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)

大家都在看

  • 多线程顺序运行的 4 种方法,面试随便问!

    文章介绍4种方法,简单易懂,通过4个demo抛砖引玉。 通过 join()方法使当前线程”阻塞”,等待指定线程执行完毕后继续执行。 举例:在线程thread…

    Java 2023年5月29日
    097
  • MySQL8.0.26安装与卸载

    一、安装 1.官网下载 百度进入官网,学习用社区版够了,我下的是压缩版点这直达下载页 据说8.X版本性能优化,比5.7版本快2倍! 接着,不登录直接下载 2.创建配置 下载完后,建…

    Java 2023年6月7日
    096
  • 浅谈java代理模式

    讲解java代理模式 讲解java代理模式 何谓代理模式 静态代理 动态代理 JDK动态代理 CGLIB动态代理 何谓代理模式 &#x4EE3;&#x7406;&a…

    Java 2023年6月7日
    0100
  • Java程序员必备的工具和框架

    最近几年,Java 的技术栈发展的非常快,成百上千的技术工具正不断地涌出来,这也造成了一个问题: 我们作为开发者,到底应该选哪些工具搭建出最合适的技术栈呢? 今天我就推荐一波我常用…

    Java 2023年6月7日
    073
  • Java基础语法(三)

    Java基础语法(三) 不积跬步,无以至千里;不积小流,无以成江海。 ——荀子《劝学》 Java基础语法(三) – 十六、方法 十七、命令行传参(扩展) 十八、可变参数…

    Java 2023年6月9日
    0102
  • Spring Boot 项目部署到 Linux服务器

    1.首先将SpringBoot项目打包成JAR包,然后通过FTP工具上传到Linux,执行如下命令: java -jar xxx.jar & 该命令执行后,启动jar,一旦…

    Java 2023年6月5日
    0113
  • 【Java分享客栈】我曾经的两个Java老师一个找不到工作了一个被迫转行了

    前言 写这篇文章的初衷主要是最近发生了两件事,让我感慨良多,觉得踏入这个行业的初始,有些事情就应该长远考虑,这样对职业发展才更有利,仅仅停留在技术的追求上固然能壮大自身,可逆水行舟…

    Java 2023年6月9日
    055
  • zookeeper简介及基操

    cpp;gutter:true; zk的安装: 1. 下载zk.tar.gz安装包,并解压至/usr/local/devInstall 2. 在zk的目录下新建文件夹data 3….

    Java 2023年6月8日
    084
  • Redis 学习笔记

    前置准备 $ wget https://download.redis.io/releases/redis-6.2.6.tar.gz $ tar xzf redis-6.2.6.ta…

    Java 2023年6月8日
    073
  • synchronized锁详解

    synchronized的意义 解决了Java共享内存模型带来的线程安全问题: 如:两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?(…

    Java 2023年6月16日
    079
  • 在Ubuntu机器上使用war包安装Jenkins

    因为一些需求需要迁移之前使用的Jenkins,原来是按照官方文档使用apt方式安装的,这次搬迁后的机器由于默认不通外网(可以通过代理走外网),因此趁此机会,尝试改用war包方式安装…

    Java 2023年6月14日
    090
  • 老生常谈系列之Aop–Aop的经典应用之Spring的事务实现分析(一)

    老生常谈系列之Aop–Aop的经典应用之Spring的事务实现分析(一) 前言 前面的系列文章已经大概讲解了Spring Aop的实现,从AspectJ开始,到Spri…

    Java 2023年6月8日
    096
  • centos7安装mysql(完整)

    安装包下载并上传到Linux系统中 官网5.7版本:https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.29-1.el7.x8…

    Java 2023年6月7日
    085
  • grep: memory exhausted, 记录一次日志查询问题

    今天某个项目的数据有些问题,需要查询日志看看具体的情况 结果在执行 cat .log |grep “关键字”* 命令后包如下错误: grep: memory…

    Java 2023年6月5日
    092
  • Redis常用数据结构及应用场景

    1. 概述 Redis 一个开源的基于键值对(Key-Value)NoSQL 数据库。使用 ANSIC 语言编写、支持网络、基于内存但支持持久化。性能优秀,并提供多种语言的 API…

    Java 2023年6月5日
    076
  • 各种java面试题目

    地址:https://www.cnblogs.com/crazymakercircle/p/14365820.html 月薪过5万 面试题 总目录 搞定下面这些面试题,2021春招…

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