【LeetCode 简单题】46- 位1的个数

声明:

今天是第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

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/83176540