题目描述
思路解析动画文字版
记住这个变量:rev 是「已经反转出来的部分」。每取一位就 rev = rev×10 + 这位,并顺手检查会不会溢出。下面每一帧都在套它。
开始前:反转结果 rev = 0。我们要从最右边的个位开始,一位位地取出来接到 rev 后面。
指针走到这一位,值是 9(高亮的就是它)。这是最右边的个位。
把 9 接到 rev 末尾:rev 变成 9。再确认它没超过 32 位上限 2147483647,安全,继续取下一位。
指针走到这一位,值是 8(高亮的就是它)。右边变灰的几位是已经接过的。
把 8 接到 rev 末尾:rev 变成 98。再确认它没超过 32 位上限 2147483647,安全,继续取下一位。
指针走到这一位,值是 7(高亮的就是它)。右边变灰的几位是已经接过的。
把 7 接到 rev 末尾:rev 变成 987。再确认它没超过 32 位上限 2147483647,安全,继续取下一位。
指针走到这一位,值是 6(高亮的就是它)。右边变灰的几位是已经接过的。
把 6 接到 rev 末尾:rev 变成 9876。再确认它没超过 32 位上限 2147483647,安全,继续取下一位。
指针走到这一位,值是 5(高亮的就是它)。右边变灰的几位是已经接过的。
把 5 接到 rev 末尾:rev 变成 98765。再确认它没超过 32 位上限 2147483647,安全,继续取下一位。
指针走到这一位,值是 4(高亮的就是它)。右边变灰的几位是已经接过的。
把 4 接到 rev 末尾:rev 变成 987654。再确认它没超过 32 位上限 2147483647,安全,继续取下一位。
指针走到这一位,值是 3(高亮的就是它)。右边变灰的几位是已经接过的。
把 3 接到 rev 末尾:rev 变成 9876543。再确认它没超过 32 位上限 2147483647,安全,继续取下一位。
指针走到这一位,值是 2(高亮的就是它)。右边变灰的几位是已经接过的。
把 2 接到 rev 末尾:rev 变成 98765432。再确认它没超过 32 位上限 2147483647,安全,继续取下一位。
指针走到这一位,值是 1(高亮的就是它)。右边变灰的几位是已经接过的。
把 1 接到 rev 末尾:rev 变成 987654321。再确认它没超过 32 位上限 2147483647,安全,继续取下一位。
每一位都取过、接过了(整排变灰)。反转后的结果就是 rev = 987654321,全程没超范围,直接返回它。
三个高频追问:rev 的含义、负号处理、末尾 0 为什么不用特判。
参考代码
def reverse(x): INT_MAX = 2**31 - 1 # 32 位上限 INT_MIN = -2**31 # 32 位下限 sign = 1 if x >= 0 else -1 # 记下正负 x = abs(x) rev = 0 while x: # 逐位取最低位 d = x % 10 # 取个位 x //= 10 rev = rev * 10 + d # 接到末尾 rev *= sign if rev < INT_MIN or rev > INT_MAX: # 溢出判 0 return 0 return rev复杂度
- 时间:O(log|x|),循环次数等于 x 的位数,每位只处理一次
- 空间:O(1),只用 rev 一个变量,不开额外数组
易错点
面试追问把动画讲成自己的话
追问rev 这个变量代表什么?
追问负数怎么处理?
追问为什么数字末尾的 0 不用特殊处理?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
汉明距离
LeetCode 461 · 简单 · 沿着 位运算 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题