为什么我写的LeetCode「回文数」题解的while循环无法正常运行?
回文数代码问题分析
你的代码无法运行的核心原因
- 原始输入值被覆盖,判断逻辑完全失效
你在while循环中不断执行x /= 10,循环结束时x的值已经被修改为0,原来的输入值完全丢失。后续你拿反转后的reverse和已经为0的x比较,无论输入是什么,reverse == x的判断几乎都不可能成立,逻辑彻底错误。 - 判断顺序完全颠倒
负数本身不可能是回文数(负号处于首位不可能和末尾匹配),但你把负数判断放在了while循环之后,此时x已经被改为0,x < 0的判断永远不会触发,完全失去了作用。 - 全量反转存在整数溢出风险
如果输入的x是较大的正整数,反转过程中reverse = reverse * 10 + num很容易超出int类型的取值范围,导致数值溢出错误,最终判断结果异常。
为什么while(x > reverse)的写法可以正常运行
这种写法的核心逻辑是只反转整数的后半段,既不需要保留完整的原始x值,也从根源上避免了溢出风险:
- 运行逻辑示例:输入
12321,循环过程中reverse不断拼接最后一位,x不断去掉最后一位:
初始状态:x=12321,reverse=0
第一次循环后:x=1232,reverse=1
第二次循环后:x=123,reverse=12
第三次循环后:x=12,reverse=123
此时x=12 < reverse=123,循环停止,刚好完成后半段的反转 - 最终判断逻辑:如果是偶数位的回文数,直接判断
x == reverse即可;如果是奇数位的回文数,中间的数字不影响回文判断,判断x == reverse / 10即可。既保留了前半段的数值,又因为只反转一半位数,完全不会出现整数溢出的问题。
如果你要坚持全反转的实现思路,可以修改为如下可用版本:
class Solution { public boolean isPalindrome(int x) { // 提前排除负数、末尾为0且非0的特殊情况 if (x < 0 || (x % 10 == 0 && x != 0)) { return false; } // 存储原始x值,避免循环中被覆盖 int originalX = x; int reverse = 0; int num; while (x != 0){ num = x % 10; x /= 10; reverse = (reverse * 10) + num; } return reverse == originalX; } }
内容的提问来源于stack exchange,提问作者PostChalone
相关产品推荐
相关产品推荐

