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

做设计网站国内真正的永久免费建站

做设计网站,国内真正的永久免费建站,房地产资讯,张家港阿里网站建设LeetCode 第191题:位1的个数 题目描述 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。 难度 简单 题目链接 点…

LeetCode 第191题:位1的个数

题目描述

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

难度

简单

题目链接

点击在LeetCode中查看题目

示例

示例 1:

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

示例 2:

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

示例 3:

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

提示

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

进阶

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

解题思路

方法一:循环检查每一位

这是最直观的方法,我们可以通过将输入数字右移,然后检查最低位是否为1来计算位1的个数。

关键点:

  1. 循环32次(对应32位无符号整数的位数)
  2. 每次循环,检查最低位是否为1
  3. 将数字右移一位

时间复杂度:O(1),因为我们只需要遍历固定的32位
空间复杂度:O(1),只需要常数额外空间

方法二:位操作技巧

这个方法利用 n & (n-1) 可以消除 n 中最低位的 1 的特性来计算位1的个数。

关键点:

  1. 当 n != 0 时,重复执行 n = n & (n-1)
  2. 每次执行这个操作会消除 n 中最低位的 1
  3. 记录操作的次数,即为位1的个数

时间复杂度:O(k),其中 k 是输入数字中 1 的个数
空间复杂度:O(1),只需要常数额外空间

方法三:查表法(分治思想)

这个方法将32位数字分成8个4位的块,然后使用预先计算好的查找表来快速得到每个块中1的个数。

关键点:

  1. 预先计算0到15(对应4位二进制)中每个数字的位1个数
  2. 将32位数字分成8个4位的块
  3. 使用查表法快速计算每个块中1的个数
  4. 将所有块中1的个数相加得到结果

时间复杂度:O(1),因为我们只需要进行固定次数的操作
空间复杂度:O(1),查找表的大小是固定的(16个条目)

代码实现

C# 实现

方法一:循环检查每一位
public class Solution {public int HammingWeight(uint n) {int count = 0;// 循环检查每一位for (int i = 0; i < 32; i++) {if ((n & 1) == 1) {count++;}n >>= 1;}return count;}
}
方法二:位操作技巧
public class Solution {public int HammingWeight(uint n) {int count = 0;while (n != 0) {n &= (n - 1); // 消除最低位的1count++;}return count;}
}
方法三:查表法
public class Solution {// 预计算0到15中每个数字的位1个数private readonly int[] bitCounts = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};public int HammingWeight(uint n) {int count = 0;// 将32位分成8个4位的块for (int i = 0; i < 8; i++) {count += bitCounts[n & 0xF]; // 计算当前4位中1的个数n >>= 4; // 右移4位,处理下一个块}return count;}
}

Python 实现

方法一:循环检查每一位
class Solution:def hammingWeight(self, n: int) -> int:count = 0# 循环检查每一位for i in range(32):if n & 1:count += 1n >>= 1return count
方法二:位操作技巧
class Solution:def hammingWeight(self, n: int) -> int:count = 0while n:n &= (n - 1)  # 消除最低位的1count += 1return count
方法三:查表法
class Solution:def __init__(self):# 预计算0到15中每个数字的位1个数self.bit_counts = [0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4]def hammingWeight(self, n: int) -> int:count = 0# 将32位分成8个4位的块for i in range(8):count += self.bit_counts[n & 0xF]  # 计算当前4位中1的个数n >>= 4  # 右移4位,处理下一个块return count

C++ 实现

方法一:循环检查每一位
class Solution {
public:int hammingWeight(uint32_t n) {int count = 0;// 循环检查每一位for (int i = 0; i < 32; i++) {if (n & 1) {count++;}n >>= 1;}return count;}
};
方法二:位操作技巧
class Solution {
public:int hammingWeight(uint32_t n) {int count = 0;while (n) {n &= (n - 1); // 消除最低位的1count++;}return count;}
};
方法三:查表法
class Solution {
private:// 预计算0到15中每个数字的位1个数const int bitCounts[16] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};public:int hammingWeight(uint32_t n) {int count = 0;// 将32位分成8个4位的块for (int i = 0; i < 8; i++) {count += bitCounts[n & 0xF]; // 计算当前4位中1的个数n >>= 4; // 右移4位,处理下一个块}return count;}
};

性能分析

各语言实现的性能对比:

实现语言方法执行用时内存消耗特点
C#方法一24 ms25.1 MB直观简单
C#方法二20 ms25.2 MB性能优秀,尤其当1的个数较少时
C#方法三24 ms25.4 MB性能稳定,适合多次调用
Python方法一40 ms14.9 MB直观易懂
Python方法二36 ms14.8 MB比方法一更快
Python方法三32 ms15.1 MB性能稳定
C++方法一4 ms5.9 MB简单实现
C++方法二0 ms5.8 MB性能最优
C++方法三0 ms6.0 MB查表法带来的稳定性

补充说明

代码亮点

  1. 方法一简单直观,容易理解和实现
  2. 方法二利用位运算技巧 n & (n-1) 高效消除最低位的1
  3. 方法三使用查表法优化,特别适合于多次调用的场景

n & (n-1) 的原理

n & (n-1) 操作可以消除 n 中最低位的 1。这是因为:

  • n-1 会将 n 中最低位的 1 变为 0,并将这个位之后的所有 0 变为 1
  • 将 n 与 n-1 做按位与操作,会保留除了最低位 1 及其之后的位之外的所有位,因此可以消除最低位的 1

例如:

  • n = 10110100 (180)
  • n-1 = 10110011 (179)
  • n & (n-1) = 10110000 (176)

可以看到,最低位的 1(第3位)被消除了。

常见错误

  1. 没有考虑到无符号整数和有符号整数的区别,导致右移操作结果错误
  2. 循环次数错误,没有正确处理32位整数
  3. 在方法二中,如果n为0时没有正确处理
  4. 在查表法中,没有正确分割32位整数

相关题目

  • 190. 颠倒二进制位
  • 231. 2的幂
  • 338. 比特位计数
http://www.dtcms.com/wzjs/177572.html

相关文章:

  • 哪个网站做美食视频引流推广犯法吗
  • 广西建设监理协会官网站企业网络推广方法
  • wordpress 博客系统百度网站排名关键词整站优化
  • 企业网站手机端跳转设置自助网站建设平台
  • 最大的网站建设公司排名天津seo推广服务
  • 做网站开发有哪些优点呢河南百度推广电话
  • 网站关于我们什么意思外链网盘
  • vps用什么软件做网站广东网站营销seo费用
  • 傻瓜式做网站程序济南优化哪家好
  • 学设计的网站推荐疫情最新数据
  • 南宁小程序定制开发公司陕西seo快速排名
  • 新浪云搭建wordpress百度seo报价方法
  • 个人宽带备案网站朝阳seo
  • 最新网页传奇青岛关键词优化seo
  • 个人可以做社区网站有哪些自己如何建立网站
  • 苏州网站制作设计百度网址是多少 百度知道
  • 平度网站建设公司电话个人网站开发网
  • 旅游网站开发报价单月入百万的游戏代理
  • 网站怎么做不违法网站注册地址查询
  • 网站开发要学哪些知识企业获客方式
  • 泗阳网站建设网站建设建站在线建站
  • 网页制作网站建设制作企业网站的公司
  • 企业网站备案需要什么资料sem扫描电子显微镜
  • php 简单购物网站竞价排名采用什么计费方式
  • 品牌排行榜哪个网站更权威短信营销平台
  • 2015美女图片网站源码合肥做网站哪家好
  • 重庆网站建设关键词下载
  • 网站建设教程下载html制作网页代码
  • 网站建设入门免费发布信息的网站平台
  • net做公司网站软文网站发布平台