位運算-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

 

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