问题描述:
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为‘1’
的个数(也被称为汉明重量
)。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
进阶:
- 如果多次调用这个函数,你将如何优化你的算法?
问题分析:
前些时日,遇到的一个题目,现在总结一下,其中也是LeetCode上的一个题目,今天发现LeetCode上不区分Python版本了呀。方法有很多种,参考官方总结两个较优的方法。
(1)方法一:
一个无符号整数,在计算机中一般是由4
个字节组成,1
个字节8
位,所以一种有32
位。所以,我们可以用数字1
去和每一位进行与操作(其实就用了32
个数字,这些数字都是2
的n
次方),很显然,如果这一位为1
,那么结果一定为1
,然后统计出来即可。
(2)方法二:
直接看图:
从上图可以看出来,每操作一次,就会从后面消除一个1
,所以,可以循环这样的操作(统计循环了几次,就是1
的个数),直到全为0
结束。
Python3实现:
方法一:
class Solution(object):
def hammingWeight(self, n):
"""
:type n: int
:rtype: int
"""
cnt = 0 # 用于记录1的个数
mask = 1 # 用于表示2的n次方,初始化为2的0次方
for i in range(32):
if n & mask != 0: # 按位与操作
cnt += 1
mask <<= 1 # 左移一位,相当于乘以2
return cnt
方法二:
class Solution(object):
def hammingWeight(self, n):
"""
:type n: int
:rtype: int
"""
cnt = 0 # 用于记录1的个数
while n != 0:
cnt += 1 # 计数
n &= n - 1 # 按位与操作
return cnt
if __name__ == '__main__':
solu = Solution()
print(solu.hammingWeight(110))
声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。