声明:
今天是第46道题。编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
示例 :
输入: 11 输出: 3 解释: 整数 11 的二进制表示为 00000000000000000000000000001011
示例 2:
输入: 128 输出: 1 解释: 整数 128 的二进制表示为 00000000000000000000000010000000
解法1。这道题解法和上一篇博客《颠倒二进制位》转换为2进制的做法一样,再利用string自带属性count()对1进行计数并返回。同时如果输入是有符号整数比如是负数该如何呢?这个做法暂时还没考虑,有人做了,详见结尾处解法1的链接。以下做法耗时28 ms, 在Number of 1 Bits的Python提交中击败了93.10% 的用户,代码如下。
class Solution(object):
def hammingWeight(self, n):
"""
:type n: int
:rtype: int
"""
# 解法1的 V 1.0版本
return '{:b}'.format(n).count('1') # 此处不必转为32位,不足高位补0的二进制数,只需转为2进制数即可
# 解法1的 V 2.0版本
return bin(n)[2:].count('1')
解法2。通过发现规律来计数,把一个整数减去1之后再和原来的整数做按位与,得到的结果相当于是把整数的二进制表示中最右边的一个1变成0,解释见下。耗时36 ms, 在Number of 1 Bits的Python提交中击败了28.09% 的用户,代码如下。看来这种做法效率很低,不值得提倡啊……
- 如10进制数12,二进制表示为1100。12与11按位与即1100 & 1011后为1000,即8;8与7按位与即1000 & 0111后为0000。运算了2次,对应12的2进制表示有2个1
class Solution(object):
def hammingWeight(self, n):
"""
:type n: int
:rtype: int
"""
from ctypes import *
count = 0
while c_int(n).value: # 将n转为c long 类型,判断条件为n不为0
count += 1
n = n & n-1
return count
结尾
解法1:https://blog.csdn.net/u010005281/article/details/79851154
解法2:https://blog.csdn.net/iyuanshuo/article/details/79653537