题目描述
思路解析动画文字版
逐位除 2 可以做,但不如直接利用位运算。
n & (n-1) 会把最低位的 1 清零,循环几次就有几个 1。
1. 技巧 · n & (n−1) 清最低位的 1:数 n 里有几个 1。诀窍:n & (n−1) 每做一次,就清掉最低位的一个 1;做了几次,就有几个 1。绿色是当前的 1。
2. 第 1 次:清掉最右的 1:1011 & 1010 = 1010:最低位(最右)的 1 被清成 0,其余不变。计数 1。
3. 第 2 次:再清一个 1:1010 & 1001 = 1000:当前最低位的 1 又被清掉。计数 2。
4. 第 3 次:清掉最后一个 1:1000 & 0111 = 0000:最后一个 1 清掉,n 变 0。计数 3。
5. 关键帧 · 为什么能清最低位的 1:关键帧:为什么 n & (n−1) 清的恰是最低位的 1?n−1 会把最低位的 1 变 0、它右边的 0 全变 1,左边不变;和 n 相与,那个最低位 1 被抹掉、其余原样。n 变 0 时停,做的次数 = 1 的个数 = 3。
一句话记住:n & (n-1) 会把最低位的 1 清零,循环几次就有几个 1。
边界三连:三种边界先想清楚。
面试追问 1:核心技巧。
面试追问 2:为什么成立。
面试追问 3:其它数 1 写法。
这题学完不要乱跳,下一步去对应专题 /leetcode-animation/ds?k=bit 连刷同类题;卡住时用 AI 答疑问“我的状态定义哪里不稳”。
参考代码
class Solution: def hammingWeight(self, n): ans = 0 while n: n &= n - 1 ans += 1 return ans复杂度
- 时间复杂度:O(1),最多 32 位,循环次数 = 1 的个数 ≤ 32
- 空间复杂度:O(1),只用一个计数器
可套用的代码模板
骨架:反复 n &= n−1 清掉最低位 1,清几次就有几个 1。
Python
# 数 1 个数骨架 · 每次清最低位 1ans = 0while n: n &= n - 1 # 清掉最低位的一个 1 ans += 1return ans # 循环次数 = 1 的个数易错点
面试追问把动画讲成自己的话
追问核心技巧是什么?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
比特位计数
LeetCode 338 · 简单 · 沿着 位运算 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题