题目描述
思路解析动画文字版
记住这套「取末位 → 放进结果 → 结果左移、原数右移」的三连动作,下面每一帧都在重复它。
第 1 步·取末位:用 n & 1 读出原数现在的最低位(高亮格)= 1。这一位马上要搬到结果的末尾去。
第 1 步·入结果:result 先左移腾出最低位,再把 1 填进去 →「1」。取走的那位用过即丢(原数右移),刚搬的格子变绿。
第 2 步·取末位:用 n & 1 读出原数现在的最低位(高亮格)= 0。这一位马上要搬到结果的末尾去。
第 2 步·入结果:result 先左移腾出最低位,再把 0 填进去 →「10」。取走的那位用过即丢(原数右移),刚搬的格子变绿。
第 3 步·取末位:用 n & 1 读出原数现在的最低位(高亮格)= 0。这一位马上要搬到结果的末尾去。
第 3 步·入结果:result 先左移腾出最低位,再把 0 填进去 →「100」。取走的那位用过即丢(原数右移),刚搬的格子变绿。
第 4 步·取末位:用 n & 1 读出原数现在的最低位(高亮格)= 0。这一位马上要搬到结果的末尾去。
第 4 步·入结果:result 先左移腾出最低位,再把 0 填进去 →「1000」。取走的那位用过即丢(原数右移),刚搬的格子变绿。
第 5 步·取末位:用 n & 1 读出原数现在的最低位(高亮格)= 1。这一位马上要搬到结果的末尾去。
第 5 步·入结果:result 先左移腾出最低位,再把 1 填进去 →「10001」。取走的那位用过即丢(原数右移),刚搬的格子变绿。
第 6 步·取末位:用 n & 1 读出原数现在的最低位(高亮格)= 0。这一位马上要搬到结果的末尾去。
第 6 步·入结果:result 先左移腾出最低位,再把 0 填进去 →「100010」。取走的那位用过即丢(原数右移),刚搬的格子变绿。
第 7 步·取末位:用 n & 1 读出原数现在的最低位(高亮格)= 1。这一位马上要搬到结果的末尾去。
第 7 步·入结果:result 先左移腾出最低位,再把 1 填进去 →「1000101」。取走的那位用过即丢(原数右移),刚搬的格子变绿。
第 8 步·取末位:用 n & 1 读出原数现在的最低位(高亮格)= 0。这一位马上要搬到结果的末尾去。
第 8 步·入结果:result 先左移腾出最低位,再把 0 填进去 →「10001010」。取走的那位用过即丢(原数右移),刚搬的格子变绿。
第 9 步·取末位:用 n & 1 读出原数现在的最低位(高亮格)= 0。这一位马上要搬到结果的末尾去。
第 9 步·入结果:result 先左移腾出最低位,再把 0 填进去 →「100010100」。取走的那位用过即丢(原数右移),刚搬的格子变绿。
第 10 步·取末位:用 n & 1 读出原数现在的最低位(高亮格)= 1。这一位马上要搬到结果的末尾去。
第 10 步·入结果:result 先左移腾出最低位,再把 1 填进去 →「1000101001」。取走的那位用过即丢(原数右移),刚搬的格子变绿。
第 11 步·取末位:用 n & 1 读出原数现在的最低位(高亮格)= 0。这一位马上要搬到结果的末尾去。
第 11 步·入结果:result 先左移腾出最低位,再把 0 填进去 →「10001010010」。取走的那位用过即丢(原数右移),刚搬的格子变绿。
第 12 步·取末位:用 n & 1 读出原数现在的最低位(高亮格)= 0。这一位马上要搬到结果的末尾去。
最后一位:搬入原数最高位 0,落在结果最低位;而第 1 步搬的位早被左移顶到了最高位——顺序彻底倒了过来。
12 位全部搬完,原数清空、结果定格为 100010100100。验证:把原数 001001010001 倒着读一遍 = 100010100100,与结果完全一致。32 位只是把循环从 12 次改成 32 次,逻辑一模一样。
边界都靠对称性自然成立:全 0、全 1、回文串颠倒后都等于自身;单个最低位 1 会跑到最高位。
两个高频追问:n&1 取末位的原理、以及更快的分治掩码法(加分项)。
参考代码
def reverseBits(self, n: int) -> int: result = 0 for _ in range(32): # 32 位固定循环 result = (result << 1) | (n & 1) # 结果左移 + 取原数末位 n >>= 1 # 原数右移,丢掉末位 return result复杂度
- 时间:O(1),固定循环 32 次,与输入大小无关
- 空间:O(1),只用 result 一个变量
易错点
面试追问把动画讲成自己的话
追问为什么取原数末位用 n & 1?
追问能不能不循环、用分治更快?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
丢失的数字
LeetCode 268 · 简单 · 沿着 位运算 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题