您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# LeetCode如何输出某个整数二进制中1的个数
在编程面试和算法竞赛中,计算一个整数的二进制表示中1的个数(也称为"汉明重量"或"popcount")是经典问题。本文将深入探讨该问题的多种解法,分析其时间复杂度,并提供LeetCode相关题目的实战代码示例。
## 问题定义
给定一个32位有符号/无符号整数,统计其二进制表示中`1`的个数。例如:
- 输入:`11`(二进制 `1011`)
- 输出:`3`
## 方法一:逐位检查法
### 基本思路
通过循环右移数字并检查最低位是否为1。
```python
def hammingWeight(n: int) -> int:
count = 0
while n:
count += n & 1
n >>= 1
return count
利用 n & (n-1)
可以消除最右边的1的特性。
def hammingWeight(n: int) -> int:
count = 0
while n:
n &= n - 1
count += 1
return count
预先计算0-255所有数字的1的个数,然后分段查询。
# 预先生成8位查表
table = [0] * 256
for i in range(256):
table[i] = (i & 1) + table[i >> 1]
def hammingWeight(n):
return (table[n & 0xff] +
table[(n >> 8) & 0xff] +
table[(n >> 16) & 0xff] +
table[n >> 24])
通过位运算并行计算多个位的1的个数。
def hammingWeight(n):
n = (n & 0x55555555) + ((n >> 1) & 0x55555555)
n = (n & 0x33333333) + ((n >> 2) & 0x33333333)
n = (n & 0x0F0F0F0F) + ((n >> 4) & 0x0F0F0F0F)
n = (n & 0x00FF00FF) + ((n >> 8) & 0x00FF00FF)
n = (n & 0x0000FFFF) + ((n >> 16) & 0x0000FFFF)
return n
方法 | 循环次数 | 适用场景 |
---|---|---|
逐位检查 | 32 | 简单易懂 |
Brian Kernighan | 1-32 | 常规最优解 |
查表法 | 4 | 大量重复计算 |
SWAR | 5 | 极致性能要求 |
直接应用上述方法:
class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
while n:
res += 1
n &= n - 1
return res
n.bit_count() # Python 3.10+
bin(n).count('1')
public int hammingWeight(int n) {
return Integer.bitCount(n); // 内部使用SWAR算法
}
掌握二进制位操作技巧对优化算法性能具有重要意义,这类思想还可应用于布隆过滤器、位图等数据结构实现。 “`
注:本文实际约1100字,包含代码示例、复杂度分析和不同场景的解决方案选择建议。Markdown格式便于直接发布到技术博客平台。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。