题目描述
思路解析动画文字版
转字符串很直观,但要额外开一段空间,而且面试常要求不转字符串。纯数学法能做到常数空间。
不反转整个数,只反转后一半。循环停下时,x 是左半边、rev 是反转过的右半边,两边一比就知道是不是回文。
边界先挡:负数 + 末尾为 0:负数不对称,直接 false。末尾为 0 的非零数反转后首位会是 0,也直接 false。x=0 是唯一例外,最后会被放行。
初始化 rev = 0,准备进循环:rev 从 0 开始。每轮把 x 最低位弹出来接到 rev 后面。循环条件是 x 大于 rev,保证只处理后一半。
第 1 轮:弹末位 1 → rev=1:弹出最右边的 1,接到 rev 后面,rev 变 1。x 砍掉末位变 1232。x 还远大于 rev,继续。
第 2 轮:弹末位 2 → rev=12:再弹出 2,rev 变 12(右边的 21 已经被反转成 12)。x 变 123,还是大于 rev,继续。
第 3 轮:中间位 3 也跑进 rev:奇数位的中间那位 3 也被弹进了 rev,rev=123。x 变 12,现在 x 小于 rev,循环停止——后一半反转完了。
停下后:奇数位用 rev // 10 去掉中间位:奇数位时 rev 多带了中间的 3。x==rev 不成立,但去掉中间位后 rev//10=12,正好等于左半 x=12,所以 12321 是回文。
灵魂帧慢放 · 偶数位 1221 怎么停:偶数位没有中间位:弹两次后 x=12、rev=12 直接相等。所以 x==rev 管偶数位,x==rev//10 管奇数位,一行覆盖两种。
雷区实演 · x=10 当场被挡:如果不挡 10:反转得到 01,整数里前导 0 会丢掉变成 1,1 不等于 10、却也不好比。所以末尾为 0 的非零数提前 false。
两个要点:一是只反转后半,省运算又避开整型溢出的思路风险;二是奇偶统一成 x==rev 或 x==rev//10。
面试追问 1:防溢出是半反转的核心动机,面试时主动说出来加分。
面试追问 2:x 大于 rev 这一个条件,同时管住了取后半和判中点两件事。
面试追问 3:不转字符串是这题主要考点,面试一定要主动提空间 O(1) 这条。
迁移阶梯:学完回文数去整数拆位专题连刷:lc7 整数反转用同样的取末位拼接,lc202 快乐数也靠拆位循环。卡住时用 AI 答疑问『我的奇偶判断哪里不稳』。进专题:/leetcode-animation/ds?k=bit
边界三连:负数、末尾零、零本身三种边界都想清楚,这题才算真的掌握。
参考代码
class Solution: def isPalindrome(self, x: int) -> bool: if x < 0 or (x % 10 == 0 and x != 0): return False rev = 0 while x > rev: rev = rev * 10 + x % 10 x //= 10 return x == rev or x == rev // 10复杂度
- 时间复杂度:O(log n),x 的位数是 log10(x);每轮砍掉一位、只处理后一半,约循环 log10(x)/2 次。
- 空间复杂度:O(1),只用 rev 一个整数变量,不开字符串、不开数组。
可套用的代码模板
三步骨架:排边界 → while x 大于 rev 反转后半 → 奇偶两种比较。两个挖空(循环条件 rev、奇数位 rev//10)就是本题命门,背下就能默写。
# 步骤 1:排掉不可能是回文的——负数 / 末尾 0 的非零数if x < 0 or (x % 10 == 0 and x != 0): return False# 步骤 2:只反转后一半,rev 赶上 x 就停rev = 0while x > ____: # 填:rev rev = rev * 10 + x % 10 x //= 10# 步骤 3:偶数位 x==rev;奇数位去掉中间位return x == rev or x == ____ # 填:rev // 10易错点
面试追问把动画讲成自己的话
追问为什么只反转后一半,不反转整个数?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。再去主线里挑下一道练手。
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题