You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我写的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 10:00:01