位运算-LeetCode191. 位1的个数(剑指15:二进制中1的个数)

0、剑指15题(不同点:输入的是十进制数!

15:二进制中1的个数(剑指offer第2版Python)

参考

https://blog.csdn.net/u010005281/article/details/79851154

https://www.zhihu.com/question/314455297?sort=created

1、题目描述(输入的是二进制串,但是代码完全与剑指输入十进制数的一样即可,不然反而力扣无法通过,迷)

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

2、代码详解

6的二进制是 110 ,6-1=5的二进制是 101,6&5=100, 如此操作之后6中原来的110变为100,循环计数统计1的个数,直至n变为0为止。

class Solution(object):
    def hammingWeight(self, n):
        """
        :type n: int
        :rtype: int
        """
        # 二进制转换十进制,加上LeetCode反而不通过(未解)
        # n = str(n)
        # n = int(n, 2)

        count = 0
        # 如果为负数,用补码表示
        if n < 0:
            n = n & 0xffffffff
        while n:
            count += 1
            n = (n - 1) & n  # 原整数先减去1,再与原整数做“与&”,相当于把最右边的1变成0

        return count

 

class Solution(object):
    def hammingWeight(self, n):
        """
        :type n: int
        :rtype: int
        """
        return bin(n).count("1")

https://blog.csdn.net/qq_32424059/article/details/97119297

3、九章算法类似题:数组形式返回(dp)

不同之处:leetcode的要求是查询一个数(不能用dp),我们这个lintcode是要return整个数组

题目:给出一个 非负 整数 num,对所有满足 0 ≤ i ≤ num 条件的数字 i 均需要计算其二进制表示中数字 1 的个数并以数组的形式返回

时间复杂度为 O(n * sizeof(integer))的解法很容易想到, 尝试挑战线性的时间复杂度 O(n) (只遍历一遍)。空间复杂度应为 O(n)

https://www.jiuzhang.com/problem/counting-bits/#tag-highlight-lang-python

class Solution(object):
    def countBits(self, num):
        """
        :type n: int
        :rtype: int
        """
        f = [0] * (num + 1)
        for i in range(1, num+1):
            f[i] = f[i >> 1] + (i % 2)  # 去掉最后一位剩下的1的个数 + 最后一位是否是1
        return f


n = 5
# n = 11111111111111111111111111111101  # dp不能通过,需要一个大数组,开辟时会造成memoryError
s = Solution()
print(s.countBits(n))  # 4:100, 5:101,打印[0, 1, 1, 2, 1, 2]

思路:

状态转移方程为dp[i] = dp[i / 2]+i % 2 或 dp[i]=dp[i<<1]+i%2  (相同意思)

在这个dp里,i>>1就是i//2,那么i的二进制里的1的数量,就是他写成二进制以后前面的1数量加上最后一位

4、Python中二进制和十进制的转换

n = 101  # 二进制
n = str(n)
num = int(n, 2)  # 输入的二进制数,转换为十进制,拓:numb = bin(num)十进制转换二进制
print(num)  # 5

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章