当前位置: 首页 > news >正文

Leetcode 191.位1的个数

 

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。

提示:

  • 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
  • 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在 示例 3 中,输入表示有符号整数 -3

示例 1:

输入:n = 00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:

输入:n = 00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例 3:

输入:n = 11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

提示:

  • 输入必须是长度为 32 的 二进制串 。

进阶

  • 如果多次调用这个函数,你将如何优化你的算法?

我的答案:

一、信息

1.输入是一个二进制无符号整数

2.返回'1'的个数

二、分析

条件1告诉我输入的数据类型是无符号整型

条件2告诉我此次编程的目标

三、步骤

遇到问题

1.如何计算位数? 

四、实现 

我的答案:

毫无思路

这是一个常见的面试问题。让我们首先为这个问题创建一个C语言的解决方案,然后是一个C++的解决方案。

#include <stdint.h> // for uint32_tint hammingWeight(uint32_t n) {int count = 0;while (n) {count += n & 1;n >>= 1;}return count;
}

C++:

#include <cstdint> // for uint32_tint hammingWeight(uint32_t n) {int count = 0;while (n) {count += n & 1;n >>= 1;}return count;
}

进阶:优化算法

如果要多次调用这个函数,我们可以使用Brian Kernighan的算法,它可以更快地计算二进制中1的个数,它的工作原理是每次迭代都去掉最右边的1,直到所有的1都被去掉。

C语言(进阶)

#include <stdint.h> // for uint32_tint hammingWeight(uint32_t n) {int count = 0;while (n) {n &= (n - 1);count++;}return count;
}

C++(进阶)

#include <cstdint> // for uint32_tint hammingWeight(uint32_t n) {int count = 0;while (n) {n &= (n - 1);count++;}return count;
}

Brian Kernighan的算法的效率是O(k),其中k是二进制数中1的个数,因此对于具有少量1的数字,它的效率非常高。

Leetcode答案

方法一:循环检查二进制位
思路及解法

我们可以直接循环检查给定整数 nnn 的二进制位的每一位是否为 111。

具体代码中,当检查第 iii 位时,我们可以让 nnn 与 2i2^i2 
i
  进行与运算,当且仅当 nnn 的第 iii 位为 111 时,运算结果不为 000。

代码
C++

class Solution {
public:int hammingWeight(uint32_t n) {int ret = 0;for (int i = 0; i < 32; i++) {if (n & (1 << i)) {ret++;}}return ret;}
};


复杂度分析

时间复杂度:O(k)O(k)O(k),其中 kkk 是 int\texttt{int}int 型的二进制位数,k=32k=32k=32。我们需要检查 nnn 的二进制位的每一位,一共需要检查 323232 位。

空间复杂度:O(1)O(1)O(1),我们只需要常数的空间保存若干变量。

方法二:位运算优化
思路及解法

观察这个运算:n & (n−1)n~\&~(n - 1)n & (n−1),其运算结果恰为把 nnn 的二进制位中的最低位的 111 变为 000 之后的结果。

如:6 & (6−1)=4,6=(110)2,4=(100)26~\&~(6-1) = 4, 6 = (110)_2, 4 = (100)_26 & (6−1)=4,6=(110) 
2

 ,4=(100) 
2

 ,运算结果 444 即为把 666 的二进制位中的最低位的 111 变为 000 之后的结果。

这样我们可以利用这个位运算的性质加速我们的检查过程,在实际代码中,我们不断让当前的 nnn 与 n−1n - 1n−1 做与运算,直到 nnn 变为 000 即可。因为每次运算会使得 nnn 的最低位的 111 被翻转,因此运算次数就等于 nnn 的二进制位中 111 的个数。

代码

C++
Java
Python3
Golang
JavaScript
C

class Solution {
public:int hammingWeight(uint32_t n) {int ret = 0;while (n) {n &= n - 1;ret++;}return ret;}
};


复杂度分析

时间复杂度:O(log⁡n)O(\log n)O(logn)。循环次数等于 nnn 的二进制位中 111 的个数,最坏情况下 nnn 的二进制位全部为 111。我们需要循环 log⁡n\log nlogn 次。

空间复杂度:O(1)O(1)O(1),我们只需要常数的空间保存若干变量。
链接:https://leetcode.cn/problems/number-of-1-bits/solutions/672082/wei-1de-ge-shu-by-leetcode-solution-jnwf/
来源:力扣(LeetCode)
英雄师傅答案:

int hammingWeight(uint32_t n){int c=0;while(n){if(n&1){++c;}n>>=1;}return c;
}

几种方法的比较:

我的方法

1. **Brian Kernighan算法:** 这实际上与你给出的第二种方法相同,即使用`n & (n-1)`技巧。它直接移除了数字中最右侧的'1'。

2. **直接计数:** 这是一个直观的方法。对数字的每一位进行循环,并用`n & 1`检查最低位是否为'1'。之后,右移数字。

### 对比与分析

**1. 循环检查二进制位 vs 直接计数**
- **思路相似性:** 这两种方法都是基于检查每一位来计算'1'的数量。
- **优势:** 这两种方法都是非常直观的。对于初学者或者希望代码具有更高可读性的情境,它们都很适用。
- **劣势:** 它们的性能可能不如位运算优化方法,特别是当原始数字的二进制表示中有较少的'1'时。

**2. 位运算优化 vs Brian Kernighan算法**
- **思路相似性:** 它们实际上是同一种方法。都使用了`n & (n-1)`的技巧来移除数字中的一个'1'。
- **优势:** 它们都比直接计数方法快,尤其是在数字中'1'较少时。
- **劣势:** 对于不熟悉这种特定位运算的人来说,可能不够直观。

### 总结

- 我的"直接计数"方法和你给的"循环检查二进制位"方法非常相似。它们都是基于检查每一位的简单方法。然而,由于涉及到的位移操作,实现的细节可能会有所不同。
  
- 我的"Brian Kernighan算法"和你给的"位运算优化"方法实际上是同一种方法。这种方法利用了`n & (n-1)`来高效地计算'1'的数量,它比基于逐位检查的方法更快。

无论选择哪种方法,最重要的是理解其背后的逻辑和原理,这样在遇到不同的问题时,你可以灵活地应用和调整这些方法。

总结:

一、发现的不足。

1.运算符>>知识点尤其是移位运算不熟悉

2.

二、学到什么?

从这道题目中,我们可以学到以下几点:

1. **二进制基础**:题目加深了我们对二进制数的理解,特别是如何操作和解读32位无符号整数的二进制形式。

2. **位操作**:题目展示了如何使用位操作符,特别是`&` (位与) 和 `<<` (左移)。位操作是计算机科学中的一个重要概念,特别是在低级编程、嵌入式系统和性能关键应用中。

3. **算法优化**:通过比较两种方法,我们看到了如何从一个直接的算法优化到一个更高效的算法。方法一直接检查每一位,而方法二使用了一个巧妙的技巧,即`n & (n - 1)`,来迅速定位并清除最右侧的`1`。这显示了算法和数据结构知识的重要性,特别是如何使用基础的位操作来优化算法。

4. **代码简洁性和效率**:两种方法都提供了解决同一问题的有效方法,但它们之间的效率有所不同。这强调了在解决问题时不仅要考虑解决方案的正确性,还要考虑其效率。

5. **问题分析与解决策略**:面对一个问题时,首先需要理解其背后的概念和要求,然后尝试提出不同的策略或方法。对于同一个问题,可能存在多种有效的解决策略,但它们在实际应用中的效率可能会有所不同。

6. **细节注意**:在处理位操作时,特别要注意边界条件和位数。例如,对于32位的整数,当我们移动超过32位时,需要注意可能出现的行为。

综上所述,这道题目为我们提供了一个很好的机会,来学习和实践位操作、算法优化和问题解决策略。

 

相关文章:

Leetcode 191.位1的个数

编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中…...

安防监控视频平台EasyCVR视频汇聚平台调用接口出现跨域现象的问题解决方案

视频监控汇聚EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视…...

Python中的一些常用操作

文章目录 一. Python操作之-- 使用Python 提取PDF文件中的表格数据&#xff01;二&#xff1a;三&#xff1a; Python中的 staticmethodclassmethod方法四&#xff1a; 反斜杠 \五&#xff1a; 终端的解释器提示符号修改六&#xff1a; python使用json.dumps输出中文七&#xf…...

go语言调用python脚本

文章目录 代码gopython 在 go语言中调用 python 程序&#xff0c;你可能会用到 代码 亲测 go 测试 go 文件 func TestR(t *testing.T) {// 设置要执行的Python脚本和参数scriptPath : "../nansen.py"arg1 : "nansen"// 执行Python脚本cmd : exec.Comm…...

2.3 【MySQL】命令行和配置文件中启动选项的区别

在命令行上指定的绝大部分启动选项都可以放到配置文件中&#xff0c;但是有一些选项是专门为命令行设计的&#xff0c;比方说defaults-extra-file 、 defaults-file 这样的选项本身就是为了指定配置文件路径的&#xff0c;再放在配置文件中使用就没啥意义了。 如果同一个启动选…...

外部库/lib/maven依赖项 三者关系

外部库(存放项目初始配置的jar包)(它的文件夹里并没有包含lib文件夹的引的外部的依赖的jar包) lib(存放外部导入到项目的依赖的jar包) maven依赖项(管理项目所有的jar包依赖) 三者存放jar包的关系 项目所依赖的全部的jar包 maven依赖项的jar包 外部库中的jar包 lib中的…...

在线制作作息时间表

时光荏苒&#xff0c;岁月如梭&#xff0c;人们描述时光易逝的句子&#xff0c;多如星河。 一寸光阴一寸金&#xff0c;寸金难买寸光阴。 人生就是一段时间而已&#xff0c;所以我明白了一个道理 人生之中最大的浪费就是时间的浪费 因此我想我们教给我们孩子重要的一课应该也是…...

他们朝我扔泥巴(scratch)

前言 纯~~~属~~~虚~~~构~~~&#xff08;同学看完短视频要我做&#xff0c;蟹蟹你&#xff09; 用scratch做的&#xff0c;幼稚得嘞(&#xffe3;_&#xffe3;|||)呵呵&#xff08;强颜欢笑&#xff09; 完成视频 视频试了好久&#xff0c;就是传不上来&#xff0c;私信我加我…...

docker部署前端项目保姆级教程

本地启动docker&#xff08;有不会启动的吗&#xff1f;下载docker&#xff08;小海豚&#xff09;双击起来就行&#xff09; 准备阿里云账号&#xff08;免费&#xff09; 没有就去注册一个&#xff0c;记住密码后面要用到 官网地址&#xff1a;阿里云登录 - 欢迎登录阿里云…...

《C和指针》笔记13: static关键字总结

这里对static关键字做一下总结&#xff0c;可以回顾一下前面两篇博客的文章。 《C和指针》笔记11: external和internal链接属性 《C和指针》笔记12: 存储类型&#xff08;自动变量、静态变量和寄存器变量&#xff09; 当它用于函数定义时&#xff0c;或用于代码块之外的变量声…...

Docker harbor私有仓库部署与管理

一、搭建本地私有仓库二、Harbor私有仓库部署与管理1、Harbor概述2、Harbor的特性3、Harbor的核心组件3.1 Proxy3.2 Registry3.3 Core services3.3.1 UI&#xff08;harbor-ui&#xff09;3.3.2 WebHook3.3.3 Token 服务 3.4 Database&#xff08;harbor-db&#xff09;3.5 Log…...

解锁Selenium的力量:不仅仅是Web测试

Selenium简介 Selenium&#xff0c;作为Web应用测试的领军者&#xff0c;已经成为了无数开发者和测试人员的首选工具。它不仅仅是一个自动化测试工具&#xff0c;更是一个强大的Web应用交互框架。 Selenium的起源与发展 Selenium的历史可以追溯到2004年&#xff0c;由Jason Hu…...

[SQLITE_ERROR] SQL error or missing database (near “=“: syntax error)【已解决】

这个报的错误是语法错误&#xff0c;但是我并没有看出来这行代码有什么错。 通过排除掉下边两个问题解决的 从增加记录方法复制的下来的代码&#xff0c;只删除了关闭自动提交事务&#xff0c;但是connection.commit忘记删除executeQuery和executeUpdate方法的用法忘记了&…...

【视觉系统】笔芯内径机器视觉测量软硬件方案-康耐德智能

检测内容 笔芯内径机器视觉测量系统 检测要求 精度0.03mm&#xff0c;速度120~180个/分钟 视觉可行性分析 对样品进行了光学实验&#xff0c;并进行图像处理&#xff0c;原则上可以使用机器视觉系统进行测试测量。 结果&#xff1a; 对所有样品进行分析&#xff0c;可以在不…...

将文件夹的名称写到Excel中

查看文件夹名称 os.listdir()函数会返回指定路径下的所有文件和文件夹的名称列表&#xff0c;包括隐藏文件和文件夹 import osfolder_path . # 文件夹路径 # . is当前路径 files os.listdir(folder_path) # 获取文件夹内所有文件的名称列表for filename in files:print(fi…...

关于Vue CLI项目 运行发生了 less-lorder错误的解决方案

Module node found :Error: Can’t resolve ‘less-loader’ 报错 文章目录 Module node found :Error: Cant resolve less-loader 报错解决方案&#xff1a;安装 webpack 和 less安装 less-loader 问题&#xff1a; 在运行vue项目的时候发生&#xff1a; Module not found: Er…...

【Qt学习】02:信号和槽机制

信号和槽机制 OVERVIEW 信号和槽机制一、系统自带信号与槽二、自定义信号与槽1.基本使用student.cppteacher.cppwidget.cppmain.cpp 2.信号与槽重载student.cppteacher.cppwidget.cppmain.cpp 3.信号连接信号4.Lambda表达式5.信号与槽总结 信号槽机制是 Qt 框架引以为豪的机制之…...

软件工程(十三) 设计模式之结构型设计模式(一)

前面我们记录了创建型设计模式,知道了通过各种模式去创建和管理我们的对象。但是除了对象的创建,我们还有一些结构型的模式。 1、适配器模式(Adapter) 简要说明 将一个类的接口转换为用户希望得到的另一个接口。它使原本不相同的接口得以协同工作。 速记关键字 转换接…...

Node与Express后端架构:高性能的Web应用服务

在现代Web应用开发中&#xff0c;后端架构的性能和可扩展性至关重要。Node.js作为一个基于事件驱动、非阻塞I/O的平台&#xff0c;以及Express作为一个流行的Node.js框架&#xff0c;共同构建了高性能的Web应用服务。 在本文中&#xff0c;我们将深入探讨Node与Express后端架构…...

C++炸弹小游戏

游戏效果 小人可以随便在一些元素&#xff08;如石头&#xff0c;岩浆&#xff0c;水&#xff0c;宝石等&#xff09;上跳跃&#xff0c;“地面”一直在上升&#xff0c;小人上升到顶部或者没有血的时候游戏结束&#xff08;初始20点血&#xff09;&#xff0c;小人可以随意放炸…...

发送通知消息

目录 1 himall3.0商城源码 1.1 SendMessageOnOrderShipping 1.1.1 //发送通知消息 1.2 /// 所有订单是否都支付 1.2.1 //有待付款的订单&#xff0c;则未支付完成 himall3.0商城源码 public static List<InvoiceTitleInfo> GetInvoiceTitles(long userid) { re…...

Python报错:PermissionError: [Errno 13] Permission denied解决方案

Python报错&#xff1a;PermissionError: [Errno 13] Permission denied 翻译为&#xff1a;权限错误&#xff1a;[errno 13]权限被拒绝 错误产生的原因是文件无法打开&#xff0c;可能产生的原因是文件找不到&#xff0c;或者被占用&#xff0c;或者无权限访问&#xff0c;或者…...

【leetcode】第六章 二叉树part01

递归遍历 144. 二叉树的前序遍历 // 前序遍历 public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res new ArrayList<>();preOrder(root, res);return res;}private void preOrder(TreeNode root, List<Integer> res) {if (ro…...

All In One!Meta发布SeamlessM4T,支持100种语言,35种语音、开源、在线体验!

多语言识别翻译的研究一直都是学术界研究的重点。目前全球有几千种语言&#xff0c;在全球化背景下不同语言人群之间的交流越来越密切&#xff0c;然而学习一门外语的成本是非常大的。前两年的研究主要集中在一对一、一对多的研究&#xff0c;然而当面对这么多的语言时&#xf…...

Python可视化工具库实战

Matplotlib Matplotlib 是 Python 的可视化基础库&#xff0c;作图风格和 MATLAB 类似&#xff0c;所以称为 Matplotlib。一般学习 Python 数据可视化&#xff0c;都会从 Matplotlib 入手&#xff0c;然后再学习其他的 Python 可视化库。 Seaborn Seaborn 是一个基于 Matplo…...

编解码视频测试序列集

最近测试解码器性能&#xff0c;搜集了一下可以免费的测试序列及&#xff0c;现在罗列如下&#xff0c;有很多需要翻墙&#xff1a; 1、h264的视频测试序列集 https://pi4.informatik.uni-mannheim.de/~kiess/test_sequences/download/ 2、HEVC测试序列 https://blog.csdn.net/…...

1 Hadoop入门

1.Hadoop是什么&#xff1f; (1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 (2)主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题。 (3)广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念——Hadoop生态圈 2.Hadoop的优势 3 Hadoop组成 4 HDF…...

骨传导耳机哪款比较好,市面上最好的骨传导耳机分享

随着科技的日新月异&#xff0c;骨传导耳机也在不断更新换代。市场上涌现出许多品牌&#xff0c;这使得消费者在购买时感到困惑。别担心&#xff01;我们为你整理了一些市场上最好的骨传导耳机品牌&#xff0c;希望能帮到你。现在&#xff0c;就让我们一起探索这些骨传导耳机的…...

centos7安装docker-compose—及常见错误排解

目录 一、Docker-Compose概述Compose有2个重要的概念&#xff1a;一、安装docker-compose1.从github上下载docker-compose二进制文件安装 二、Docker-compose实战 二、Dcoker-compose 不好下载&#xff0c;你直接使用docker 一个一个的安装使用dockerfile安装各种服务组件 一、…...

Stable Diffusion 文生图技术原理

图像生成模型简介 图片生成领域来说&#xff0c;有四大主流生成模型&#xff1a;生成对抗模型&#xff08;GAN&#xff09;、变分自动编码器&#xff08;VAE&#xff09;、流模型&#xff08;Flow based Model&#xff09;、扩散模型&#xff08;Diffusion Model&#xff09;。…...