LeetCode 191 位1的个数

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

在编程的世界里,我们常常会遇到一些有趣又实用的小问题,今天就来和大家分享一下如何计算一个正整数二进制表示中设置位(也就是 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 返回这个统计结果就行。

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

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

 

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

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

相关文章

蓝桥杯JAVA刷题--001

文章目录 题目需求2.代码3.总结 题目需求 2.代码 class Solution {public String convertDateToBinary(String date) {if (date null || date.length() ! 10 || date.charAt(4) ! - || date.charAt(7) ! -) {throw new IllegalArgumentException("输入的日期格式不正确&…

WebRTC的线程事件处理

1. 不同平台下处理事件的API: Linux系统下,处理事件的API是epoll或者select;Windows系统下,处理事件的API是WSAEventSelect,完全端口;Mac系统下,kqueue 2. WebRTC下的事件处理类: …

zentao ubuntu上安装

#下载ZenTaoPMS-21.2-zbox_amd64.tar.gz(https://www.zentao.net/downloads.html) https://dl.zentao.net/zentao/21.2/ZenTaoPMS-21.2-zbox_amd64.tar.gzcd /opt tar -zxvf ZenTaoPMS-21.2-zbox_amd64.tar.gz#启动 /opt/zbox/zbox start /opt/zbox/zbox…

LeetCode算法题——有序数组的平方

题目描述 给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。 题解 解法一:暴力解法 思路: 该题目可通过暴力解法解决,即利用for循环遍历数组,对数组每…

vue v-for 数据增加页面不刷新

<div style"float:left;border:1px solid red;height:100px;width:600px;"><el-form-item label"多语言配置" style"width:700px;" prop"validTanleHead"><el-input style"width: 180px" placeholder"请…

前端-动画库Lottie 3分钟学会使用

目录 1. Lottie地址 2. 使用html实操 3. 也可以选择其他的语言 1. Lottie地址 LottieFiles: Download Free lightweight animations for website & apps.Effortlessly bring the smallest, free, ready-to-use motion graphics for the web, app, social, and designs.…

汇编环境搭建

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

Flutter:打包apk,详细图文介绍(一)

困扰了一天&#xff0c;终于能正常打包apk安装了&#xff0c;记录下打包的流程。建议参考我这篇文章时&#xff0c;同时看下官网的构建说明。 官网构建并发布 Android 应用详情 1、AS创建Flutter项目 2、cmd执行命令 生成一个sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

单个变量a的妙用

一道清华大学复试上机题 问题&#xff1a;为什么只需要定义一个整数变量a&#xff0c;而不是定义一个数组a[]&#xff1f; 回答 在这段代码中&#xff0c;只需要定义一个整数变量 a&#xff0c;而不是一个数组 a[]&#xff0c;是因为程序的逻辑是逐个处理输入的整数并立即输出…

【YOLOv8模型网络结构图理解】

YOLOv8模型网络结构图理解 1 YOLOv8的yaml配置文件2 YOLOv8网络结构2.1 Conv2.2 C3与C2f2.3 SPPF2.4 Upsample2.5 Detect层 1 YOLOv8的yaml配置文件 YOLOv8的配置文件定义了模型的关键参数和结构&#xff0c;包括类别数、模型尺寸、骨干&#xff08;backbone&#xff09;和头部…

手机租赁平台开发助力智能设备租赁新模式

内容概要 手机租赁平台开发&#xff0c;简单说就是让你用得起高大上的智能设备&#xff0c;不管是最新款的手机、平板&#xff0c;还是那些炫酷的智能耳机&#xff0c;这个平台应有尽有。想要体验但又不希望花大钱&#xff1f;那你就找对地方了&#xff01;通过灵活的租赁方案…

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

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

Datawhale AI冬令营(第二期)动手学AI Agent task2--学Prompt工程,优化Agent效果

目录 如何写好Prompt&#xff1f; 工具包神器1&#xff1a;Prompt框架——CO-STAR 框架 工具包神器2&#xff1a;Prompt结构优化 工具包神器3&#xff1a;引入案例 案例&#xff1a;构建虚拟女友小冰 1. 按照 CO-STAR框架 梳理目标 2. 撰写Prompt 3. 制作对话生成应用&…

SpringBoot整合springmvc

文章目录 1.SpringMVC的自动管理1.1中央转发器1.1.1Spring boot配置多个DispatcherServlet 1.2控制器1.2.1找到启动类的位置1.2.1.1SpringApplication.run()1.2.1.2SpringApplication 构造方法1.2.1.3deduceMainApplicationClass() 1.2.2ComponentScan 注解 1.3视图解析器自动管…

常见的排序算法过程和比较分析

比较分析 排序类别排序算法时间复杂度&#xff08;最好&#xff09;时间复杂度&#xff08;最坏&#xff09;时间复杂度&#xff08;平均&#xff09;辅助空间复杂度稳定性插入排序直接插入排序O(n)O(n)O(n)O(1)稳定插入排序折半插入排序O(n)O(n)O(n)O(1)稳定插入排序希尔排序…

[MySQL报错]关于发生net start mysql 服务无法启动,服务没有报告任何错误的五种解决方案。

咋直接进入主题。 我遇到的问题是net start mysql 服务无法启动&#xff0c;服务没有报告任何错误 其问题出在哪里呢 一.ini文件配置问题 在于你没有给你下载好的mysql文件中配置.ini文件。 该如何配置呢。那就是先在文件夹中创建一个文本文件&#xff0c;把下面内容复制进去…

Unity网络通信相关

Socket 通信一张图搞定 谁提供服务谁绑定端口&#xff0c;建立Listener,写Host

小波与傅里叶变换在去噪效果上的对比分析-附Matlab源程序

&#x1f468;‍&#x1f393; 博主简介&#xff1a;博士研究生 &#x1f52c; 超级学长&#xff1a;超级学长实验室&#xff08;提供各种程序开发、实验复现与论文指导&#xff09; &#x1f4e7; 个人邮箱&#xff1a;easy_optics126.com &#x1f56e; 目 录 摘要一、…

如何利用 ClickHouse 实现高级分析:MySQL 到 ClickHouse 实时数据同步指南

在数据驱动的时代&#xff0c;企业必须依靠先进的数据分析能力来提升竞争力。随着数据量的激增和业务需求的复杂化&#xff0c;传统的关系型数据库已经无法满足高效处理和实时分析的需求。ClickHouse 作为一款高性能的列式数据库&#xff0c;凭借其卓越的查询性能和可扩展性&am…

计算机网络 (12)物理层下面的传输媒体

前言 计算机网络物理层下面的传输媒体是计算机网络设备之间的物理通路&#xff0c;也称为传输介质或传输媒介&#xff0c;并不包含在计算机网络体系结构中&#xff0c;而是处于物理层之下。 一、传输媒体的分类 导向型媒体&#xff1a;电磁波被导引沿着固体媒体传播。常见的导向…