# LeetCode如何輸出某個整數二進制中1的個數
在編程面試和算法競賽中,計算一個整數的二進制表示中1的個數(也稱為"漢明重量"或"popcount")是經典問題。本文將深入探討該問題的多種解法,分析其時間復雜度,并提供LeetCode相關題目的實戰代碼示例。
## 問題定義
給定一個32位有符號/無符號整數,統計其二進制表示中`1`的個數。例如:
- 輸入:`11`(二進制 `1011`)
- 輸出:`3`
## 方法一:逐位檢查法
### 基本思路
通過循環右移數字并檢查最低位是否為1。
```python
def hammingWeight(n: int) -> int:
count = 0
while n:
count += n & 1
n >>= 1
return count
利用 n & (n-1) 可以消除最右邊的1的特性。
def hammingWeight(n: int) -> int:
count = 0
while n:
n &= n - 1
count += 1
return count
預先計算0-255所有數字的1的個數,然后分段查詢。
# 預先生成8位查表
table = [0] * 256
for i in range(256):
table[i] = (i & 1) + table[i >> 1]
def hammingWeight(n):
return (table[n & 0xff] +
table[(n >> 8) & 0xff] +
table[(n >> 16) & 0xff] +
table[n >> 24])
通過位運算并行計算多個位的1的個數。
def hammingWeight(n):
n = (n & 0x55555555) + ((n >> 1) & 0x55555555)
n = (n & 0x33333333) + ((n >> 2) & 0x33333333)
n = (n & 0x0F0F0F0F) + ((n >> 4) & 0x0F0F0F0F)
n = (n & 0x00FF00FF) + ((n >> 8) & 0x00FF00FF)
n = (n & 0x0000FFFF) + ((n >> 16) & 0x0000FFFF)
return n
| 方法 | 循環次數 | 適用場景 |
|---|---|---|
| 逐位檢查 | 32 | 簡單易懂 |
| Brian Kernighan | 1-32 | 常規最優解 |
| 查表法 | 4 | 大量重復計算 |
| SWAR | 5 | 極致性能要求 |
直接應用上述方法:
class Solution:
def hammingWeight(self, n: int) -> int:
res = 0
while n:
res += 1
n &= n - 1
return res
n.bit_count() # Python 3.10+
bin(n).count('1')
public int hammingWeight(int n) {
return Integer.bitCount(n); // 內部使用SWAR算法
}
掌握二進制位操作技巧對優化算法性能具有重要意義,這類思想還可應用于布隆過濾器、位圖等數據結構實現。 “`
注:本文實際約1100字,包含代碼示例、復雜度分析和不同場景的解決方案選擇建議。Markdown格式便于直接發布到技術博客平臺。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。