LeetCode 191 位1的个数

news2025/1/5 4:53:00

计算正整数二进制表示中汉明重量的两种实现方式对比

在编程的世界里,我们常常会遇到一些有趣又实用的小问题,今天就来和大家分享一下如何计算一个正整数二进制表示中设置位(也就是 1 的个数,专业术语叫汉明重量)的问题。这看似简单,实则里面也有不少门道呢,下面我就带大家一起来看看两种不同的实现方式以及它们各自的特点。

一、最初的实现方式及分析

先来看下面这段 Java 代码,它的目的就是计算给定正整数 n 的二进制表示中 1 的个数。

public class Solution {
    public int hammingWeight(int n) {
        int count = 0;
        //先把正整数变成二进制的形式
        while(n > 1){
            if(n % 2 == 1){
                count++;
                n /= 2;
            }
        }
        if(n == 1){
            count++;
        }
        //获取1的个数
        //输出总数
        return count;
    }
}

首先,定义了一个变量 count,用来统计 1 的个数,初始值设为 0。然后进入了一个 while 循环,只要 n 的值大于 1,就会持续执行循环体里面的操作。在循环体中,通过 n % 2 == 1 这个条件判断来检查 n 的二进制表示的最低位是不是 1。如果是 1 的话,就说明找到了一个设置位,这时候就把 count 的值加 1,接着再通过 n /= 2 操作将 n 的值除以 2,相当于去掉已经判断过的最低位,好继续去判断下一位。

当 while 循环结束后,有可能出现 n 刚好剩下 1 的情况呀,所以又单独用了一个 if 语句来判断,如果 n 等于 1,那就意味着还有一个设置位没统计到,这时候再把 count 的值加 1。最后,通过 return count 把统计好的设置位个数返回出去。

不过呢,虽然这段代码能够实现我们想要的功能,但是它存在一些不足之处哦。

从效率方面来讲,它采用的是常规的取余(%)和除法(/)运算来逐位判断整数 n 的二进制情况。要知道,在 Java 这种编程语言里,位运算的效率往往比算术运算要高很多呢,尤其是像咱们这种需要频繁去判断每一位情况的场景。每次都用取余和除法操作,计算次数多了的话,就会花费比较多的时间,要是处理的数据量很大或者整数本身比较大,那这个性能问题就会更明显啦。

从代码简洁性和可读性的角度来看,它把对 n 大于 1 时的循环处理和 n 等于 1 时的单独判断分开写了,虽然逻辑上不难理解,但是相对来说有点不够简洁,要是代码逻辑更复杂一点,这样分开处理可能就会让整体代码结构显得有点凌乱了呢。

二、改进后的实现方式

为了克服上面代码存在的一些小问题,我们可以采用位运算来对代码进行优化,下面就是改进后的代码:

public class Solution {
    public int hammingWeight(int n) {
        int count = 0;
        while (n!= 0) {
            count += n & 1;
            n >>>= 1;
        }
        return count;
    }
}

一开始也是定义了一个 count 变量,初始化为 0,用来统计 1 的个数。然后进入了 while 循环,不过这里循环的条件变成了 n!= 0,只要 n 的值不为 0,就会一直循环下去。

在循环体里面,关键的操作就是 count += n & 1 这一句啦。这里利用了位运算中的按位与(&)操作,n & 1 可以巧妙地获取 n 的二进制表示的最低位的值哦,如果最低位是 1,那这个按位与的结果就是 1,如果最低位是 0,结果就是 0,然后把这个结果累加到 count 上,就相当于统计到了这一位是不是设置位啦。接着,通过 n >>>= 1 这个无符号右移操作,把 n 的二进制表示向右移动一位,相当于去掉刚刚已经判断过的最低位,这样就能接着去判断下一位了。就这样,循环一直进行,直到 n 的值变为 0,这时候 count 里面存储的就是 n 的二进制表示中 1 的个数啦,最后通过 return count 返回这个统计结果就行。

对比最初的代码,改进后的代码在效率上有了很大的提升哦,利用位运算快速地逐位判断,避免了频繁的算术运算带来的性能损耗。而且代码结构也更加简洁明了,把整个判断和统计的过程都统一在一个循环里面完成了,让人一眼就能看明白它的逻辑,阅读和维护起来也更加方便呢。

希望通过对这两种计算正整数二进制表示中汉明重量的代码实现方式的分析,大家能对这类问题的解决以及代码优化有更深入的理解呀。在实际编程中,我们要时刻留意这些小细节,选择更高效、更简洁的实现方式,这样才能编写出高质量的代码哦。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简易屏幕共享工具-基于WebSocket

前面写了两个简单的屏幕共享工具,不过那只是为了验证通过截屏的方式是否可行,因为通常手动截屏的频率很低,而对于视频来说它的帧率要求就很高了,至少要一秒30帧率左右。所以,经过实际的截屏工具验证,我了解…

python-leetcode-多数元素

169. 多数元素 - 力扣(LeetCode) class Solution:def majorityElement(self, nums: List[int]) -> int:candidate Nonecount 0for num in nums:if count 0: # 更新候选元素candidate numcount (1 if num candidate else -1)return candidate

js按日期按数量进行倒序排序,然后再新增一个字段,给这个字段赋值 10 到1

效果如下图: 实现思路: 汇总数据:使用 reduce 方法遍历原始数据数组,将相同日期的数据进行合并,并计算每个日期的总和。创建日期映射:创建一个映射 dateMap,存储每个日期的对象列表。排序并添加…

MM-2024 | 智能体遇山开路,遇水架桥! ObVLN:突破障碍,受阻环境中的视觉语言导航

作者:Haodong Hong, Sen Wang, Zi Huang 单位:昆士兰大学 论文链接:Navigating Beyond Instructions: Vision-and-Language Navigation in Obstructed Environments (https://dl.acm.org/doi/pdf/10.1145/3664647.3681640) 代码链接&#…

1Panel自建RustDesk服务器方案实现Windows远程macOS

文章目录 缘起RustDesk 基本信息实现原理中继服务器的配置建议 中继服务器自建指南准备服务器安装1Panel安装和配置 RustDesk 中继服务防火墙配置和安全组配置查看key下载&安装&配置客户端设置永久密码测试连接 macOS安装客户端提示finder写入失败hbbs和hbbr说明**hbbs…

Tube Qualify弯管测量系统在汽车管路三维检测中的应用

从使用量上来说,汽车行业是使用弯管零件数量最大的单一行业。在汽车的燃油,空调,排气,转向,制动等系统中都少不了管路。汽车管件形状复杂,且由于安装空间限制,汽车管件拥有不同弯曲半径&#xf…

Excel文件恢复教程:快速找回丢失数据!

Excel文件恢复位置在哪里? Excel是微软开发的电子表格软件,它为处理数据和组织工作提供了便捷。虽然数据丢失的问题在数字时代已经司空见惯,但对于某些用户来说,恢复未保存/删除/丢失的Excel文件可能会很困难,更不用说…

R语言入门笔记:第一节,快速了解R语言——文件与基础操作

关于 R 语言的简单介绍 上一期 R 语言入门笔记里面我简单介绍了 R 语言的安装和使用方法,以及各项避免踩坑的注意事项。我想把这个系列的笔记持续写下去。 这份笔记只是我的 R 语言入门学习笔记,而不是一套 R 语言教程。换句话说:这份笔记不…

16、【ubuntu】【gitlab】【补充】服务器断电后,重启服务器,gitlab无法访问

背景 接wiki 【服务器断电后,重启服务器,gitlab无法访问】https://blog.csdn.net/nobigdeal00/article/details/144280761 最近不小心把服务器重启,每次重启后,都会出现gitlab无法访问 分析 查看系统正在运行的任务 adminpcad…

汇编环境搭建

学习视频 将MASM所在目录 指定为C盘

两种分类代码:独热编码与标签编码

目录 一、说明 二、理解分类数据 2.1 分类数据的类型:名义数据与序数数据 2.2 为什么需要编码 三、什么是独热编码? 3.1 工作原理:独热编码背后的机制 3.2 应用:独热编码的优势 四、什么是标签编码? 4.1 工作原理&…

二、SQL语言,《数据库系统概念》,原书第7版

文章目录 一、概览SQL语言1.1 SQL 语言概述1.1.1 SQL语言的提出和发展1.1.2 SQL 语言的功能概述 1.2 利用SQL语言建立数据库1.2.1 示例1.2.2 SQL-DDL1.2.2.1 CREATE DATABASE1.2.2.2 CREATE TABLE 1.2.3 SQL-DML1.2.3.1 INSERT INTO 1.3 用SQL 语言进行简单查询1.3.1 单表查询 …

异常与中断(下)

文章目录 一、中断的硬件框架1.1 中断路径上的3个部件1.2 STM32F103的GPIO中断1.2.1 GPIO控制器1.2.2 EXTI1.2.3 NVIC1.2.4 CPU1. PRIMASK2. FAULTMASK3. BASEPRI 1.3 STM32MP157的GPIO中断1.3.1 GPIO控制器1.3.2 EXTI1. 设置EXTImux2. 设置Event Trigger3. 设置Masking4. 查看…

「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 简易购物车功能实现

本篇教程将带你实现一个简易购物车功能。通过使用接口定义商品结构,我们将创建一个动态购物车,支持商品的添加、移除以及实时总价计算。 关键词 UI互动应用接口定义购物车功能动态计算商品管理列表操作 一、功能说明 简易购物车功能包含以下交互&#…

STM32学习之EXTI外部中断(以对外式红外传感器 / 旋转编码器为例)

中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行 中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急…

如何使用 ChatGPT Prompts 写学术论文?

第 1 部分:学术写作之旅:使用 ChatGPT Prompts 进行学术写作的结构化指南 踏上学术写作过程的结构化旅程,每个 ChatGPT 提示都旨在解决特定方面,确保对您的主题进行全面探索。 制定研究问题: “制定一个关于量子计算的社会影响的研究问题,确保清晰并与您的研究目标保持一…

HuatuoGPT-o1:基于40K可验证医学问题的两阶段复杂推理增强框架,通过验证器引导和强化学习提升医学模型的推理能力

HuatuoGPT-o1:基于40K可验证医学问题的两阶段复杂推理增强框架,通过验证器引导和强化学习提升医学模型的推理能力 论文大纲理解1. 确认目标2. 分析过程3. 实现步骤4. 效果展示 解法拆解全流程提问俩阶段详细分析 论文:HuatuoGPT-o1, Towards …

07-计算机网络面试实战

07-计算机网络面试实战 计算机网络面试实战 为什么要学习网络相关知识? 对于好一些的公司,计算机基础的内容是肯定要面的,尤其是 30k 以内的工程师,因为目前处于的这个级别肯定是要去写项目的,还没上升到去设计架构的高…

Github - 如何提交一个带有“verified”标识的commit

Github - 如何提交一个带有“verified”标识的commit 前言(Why) 今天在Github上浏览某项目的commit记录的时候发现,有的commit记录带有verified绿色标识,有的带有橘色的Unverified标识,还有的什么都不显示。 既然我是根正苗红的作者(bushi)…

中式美学|中国红电商展台咒语分享

使用工具:千鹿AI 咒语:geometric shape podium,Red background, and rose gold elements on the right side, Chinese New Year atmosphere, simple and clean light luxury scene, minimalist style, minimalist stage design, studio lighting, minim…