【LeetCode 簡單題】46- 位1的個數
阿新 • • 發佈:2018-11-04
宣告:
今天是第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