1. 程式人生 > >【LeetCode 簡單題】46- 位1的個數

【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