LeetCode刷题之HOT100之比特位计数

今天把仙剑三看完了,茂茂割肉让人无法释怀,眼泪止不住的流。长卿和紫萱的分离似乎也意味着重逢,这就是他们的宿命吧。怅然若失的感觉席卷全身,哎,做题吧。

1、题目描述

在这里插入图片描述

2、逻辑分析

题目要求将整数从0到此元素(都包括),计算每一个数二进制表示1的个数,返回数组。我想到了那个斐波拉契数,类似阶层,又有所不同,我去看看题解。官方题解给出了四种解法,其中分别是Brian Kernighan 算法与动态规划算法。下面先从第一种方法Brian Kernighan 算法开始。

Brian Kernighan 算法:从0到n,每个整数都分别计算它们的二进制中表示1的个数,再返回数组即可,而使用Brian Kernighan 算法的优点是可以在一定程度上进一步提升计算速度。Brian Kernighan算法的原理是:对于任意整数 x,令 x = x & (x−1),该运算将 x 的二进制表示的最后一个 1 变成 0。因此,对 x 重复该操作,直到 x 变成 0,则操作次数即为 x 的「二进制带有1的比特数」。

3、代码演示

public int[] countBits(int n) {
        // 创建一个大小为n+1的数组来存储结果
        int [] bits = new int[n +1];
        // 遍历从0到n的每个数字  
        for(int i = 0 ; i <= n; i++){
        // 计算当前数字i的二进制表示中1的个数,并将结果存储在数组中
            bits[i] = countOne(i);
        }
        return bits;
    }
    public int countOne(int x){
        int ones = 0;
        while(x >0){
            x &= (x - 1);
            ones++;
        }
        return ones;
    }

我叫GPT给我写注释,他说我的countOne函数写的不对,问题在于 x &= (x - 1); 这一行。这行代码确实会消除 x 的二进制表示中的最低位的1,但它并不适合用于计数。因为无论你执行多少次这个操作,只要 x 不为0,ones 就会一直增加,即使 x 的某些位原本就是0。应该这样写:

public int countOne(int x){  
    int ones = 0;  
    while(x > 0){  
        if ((x & 1) == 1) { // 检查x的最低位是否为1  
            ones++; // 如果是,增加计数  
        }  
        x >>= 1; // 右移一位,丢弃最低位的1  
    }  
    return ones; // 返回正确的计数结果  
}

时间复杂度:O(nlogn),空间复杂度:O(1)。

接下来一起看看动态规划的解法,我先去看看挑哪一个来写哈!官方的写的太深奥了,我发现了一个天才般的解法:

在这里插入图片描述

也就是说,可以根据奇数、偶数中二进制1的个数来解题。下面直接上代码,就像三行情诗一样美哈哈:

public int[] countBits(int n) { 
        int [] countOne = new int[n + 1];
        for(int i = 1; i <= n; i++){
            // 当前数字i的二进制表示中1的个数等于其除以2的商(即i/2)的二进制表示中1的个数 
            // 加上i的最低位(即i % 2)的值(0或1)
            // 这是基于一个观察:一个数字的二进制表示中1的个数与其除以2的商的二进制表示中1的个数相关
            countOne[i] = countOne[i /2] + i % 2;
        }
        return countOne;
  }

时间复杂度:O(n),空间复杂度:O(1)。

ok啦,今天差不多就到这儿了,明天好好学习!BYE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/633355.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

番外篇 | YOLOv5更换主干网络之Conformer:首个CNN + Transformer的backbone模型

前言:Hello大家好,我是小哥谈。Transformer和CNN在处理视觉表征方面都有着各自的优势以及一些不可避免的问题。因此,国科大、鹏城实验室和华为研究人员首次将二者进行了融合并提出全新的Conformer模型,其可以在不显著增加计算量的前提下显著提升了基网表征能力。论文已被IC…

“壕无人性”的沙特也要买量子计算机!巨头沙特阿美的合作方竟是它?

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;1200字丨5分钟阅读 摘要&#xff1a;石油巨头沙特阿美与 Pasqal 开启合作&#xff0c;计划于 2025 年部署一台 200 量子比特的量子计算机&#xff…

ubuntu设置root开机登录,允许root用户ssh远程登录

ubuntu与centos系统不同&#xff0c;默认root开机不能登录。 1、输入一下命令创建root密码&#xff0c;根据提示输入新密码 sudo passwd root 2、打开gdm-autologin文件&#xff0c;将auth required pam_succeed_if.so user ! root quiet_success这行注释掉&#xff0c;这行就…

Wpf 使用 Prism 实战开发Day22

客户端添加IDialogService 弹窗服务 在首页点击添加备忘录或待办事项按钮的时候&#xff0c;希望有一个弹窗&#xff0c;进行相对应的内容添加操作。 一.在Views文件夹中&#xff0c;再创建一个Dialog 文件夹&#xff0c;用于放置备忘录和待办事项的弹窗界面。 1.1 备忘录&…

ROS | 标准消息包std_msgs和common_msgs

std_msgs Duration:相对时间 可正可负 Time:绝对时间 一定大于0 Header:记录时间戳的结构体 MultiArrayDimension&#xff0c;MultiArrayLayout:描述数组的结构体 common_msgs visualization_msgs 图形显示包 几何消息包&#xff1a; 传感器消息包&#xff1a;

必应崩了?

目录 今天使用必应发现出现了不能搜索&#xff0c;弹出乱码的情况。 搜了一下&#xff0c;发现其他人也出现了同样的问题。 使用Edge浏览器的话&#xff0c;可以试着改一下DNS&#xff0c;有可能会恢复正常&#xff08;等官方修复了记得改回来&#xff09; 使用谷歌浏览器打开…

A股翻车现场

英伟达业绩炸裂&#xff0c;但今天A股这边不仅没喝着汤&#xff0c;还再度上演大型翻车现场&#xff0c;人家不仅股价大涨7个点还站上1000美元大关&#xff0c; 而咱A股里的英伟达&#xff0c;AI&#xff0c;TMT相关概念股&#xff0c;包括工业&#xff08;富联&#xff09;&am…

蓝牙Classic加密算法设计和实现,SAFER+,E0,E1,E2,E3(python)

概述 之前用python给大家实现了所有LE相关加密工具算法。bobwenstudy/BluetoothCryptographicToolbox: LE SMP加密算法设计和实现(python) (github.com)&#xff0c;最近重温了下Classic加密&#xff0c;顺便将Classic所有加密算法给实现了一遍。 在蓝牙Classic Spec中&#…

【STM32项目】基于stm32智能鱼缸控制系统的设计与实现(完整工程资料源码)

实物演示效果 基于stm32智能鱼缸控制系统的设计与实现 目录&#xff1a; 实物演示效果 目录&#xff1a; 一、 绪论 1.1 项目研究目的及意义 1.1.1 选题目的 1.1.2 选题意义 1.2 国内外研究现状 1.2.1 国外发展现状 1.2.2 国内发展现状 1.3 项目研究内容 二、智能鱼缸系统总体设…

IPA酒精清洁笔:打印机打印头、相机镜头等光学设备清洁的好帮手!

打印机打印头、相机镜头等光学设备在长期使用的过程中&#xff0c;会产生油脂、污渍和灰尘等污染物杂质&#xff0c;从而影响到打印质量、镜头清晰度等。通过IPA酒精清洁笔可以简便快捷、安全有效的清除这些污染物杂质&#xff0c;保持设备表面的清洁度&#xff0c;从而确保设备…

列举几个淘宝商品详情API接口测试示例

API名&#xff1a;item_get 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes…

MyBatis入门——MyBatis XML配置文件(3)

目录 一、配置连接字符串和MyBatis 二、写持久层代码 1、添加 mapper 接口 2、添加 USerInfoXmlMapper.xml 3、测试类代码 三、增删改查操作 1、增&#xff08;Insert&#xff09; 返回自增 id 2、删&#xff08;Delete&#xff09; 3、改&#xff08;update&#xf…

Java中Spring MVC 来如何接收表单数据

目录 一、Java语言介绍 二、Spring MVC 框架介绍 三、什么是表单 四、Spring MVC 来如何接收表单数据 一、Java语言介绍 Java是一种广泛使用的面向对象的编程语言&#xff0c;由Sun Microsystems公司的James Gosling等人开发。它最初于1995年发布&#xff0c;被设计为具有…

Android Studio 与 Gradle 及插件版本兼容性

Android Studio 开始新项目时&#xff0c;会自动创建其中部分文件&#xff0c;并为其填充合理的默认值。 项目文件结构布局&#xff1a; 一、Android Gradle 及插件作用&#xff1a; Android Studio 构建系统以 Gradle 为基础&#xff0c;并且 Android Gradle 插件 (AGP) 添加…

利用远控工具横向

一.横向移动介绍和方式 1.介绍 内网渗透的横向移动是指攻击者在成功进入内网后&#xff0c;通过利用内部系统的漏洞或者获取的合法访问权限&#xff0c;从一个受感染的系统向其他系统扩散或移动。这种横向移动的目的通常是为了获取更多的敏感信息、提升权限、扩大攻击面或者更…

记录踩坑事件 分页查询order by出现重复数据bug

MySQL排序小坑_mysql order by name相同导致排序混乱-CSDN博客 1、问题描述 列表页分页查询出现重复数据。 2、问题排查 排查最终执行sql日志。 select * from tableA where (start_time>2024-04-17 00:00:00) AND (start_time<2024-05-18 00:00:00) ORDER BY sta…

rocketmq 学习二 基本概念

教程&#xff1a;基本概念 | RocketMQ 视频教程 https://www.bilibili.com/video/BV1d5411y7UW?vd_sourcef1bd3b5218c30adf0a002c8c937e0a27 版本&#xff1a;5.0 一 基本概念 1.1 生产者/Producer 1.1.1 定义 消息发布者。是构建并传输消息到服务端的运行实体。…

mac远程桌面连接工具:Microsoft Remote Desktop正式版

Microsoft Remote Desktop 是一款由微软开发的远程桌面控制软件。它允许用户通过互联网连接到远程计算机&#xff0c;从而可以在本地计算机上访问和控制远程计算机的桌面、文件和应用程序。 下载地址&#xff1a;https://www.macz.com/mac/1004.html?idOTI2NjQ5Jl8mMjcuMTg2Lj…

ACM实训

【碎碎念】继续搞习题学习&#xff0c;今天完成第四套的ABCD&#xff0c;为下一周挤出时间复习&#xff0c;加油 Digit Counting 问题 法希姆喜欢解决数学问题。但有时解决所有的数学问题对他来说是一个挑战。所以有时候他会为了解决数学难题而生气。他拿起一支粉笔&#xff…

通过管理系统完成商品属性维护

文章目录 1.数据库表设计1.商品属性表 2.renren-generator生成CRUD1.基本配置检查1.generator.properties2.application.yml 2.启动RenrenGeneratorApplication.java生成CRUD1.启动后访问localhost:812.生成商品属性表的crud 3.将crud代码集成到项目中1.解压&#xff0c;找到ma…