leetcode: Palindrome Number

本文介绍了一种高效判断整数是否为回文数的方法,通过不断比较最高位和最低位数字并逐步移除的方式,避免了额外空间的使用,同时解决了计算过程中可能产生的溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

Determine whether an integer is a palindrome. Do this without extra space.

 

原问题链接:https://leetcode.com/problems/palindrome-number/

 

 

问题分析

    判断回文数字的问题其实思路也比较简单。就是每次从数字的最高位和最低位进行比较。如果一直比较到它们两个位置重叠了还是相同的,那么就返回true,否则就返回false。因为每次要返回最高位,所以我们需要有一个数字来计算最高位。比如说1123,那么要求最高位我们就需要用这个数字除以1000。在求得这个数字之后,每次原数字除以它就得到最高位,原数字对10取模操作就得到最低位。假设这个数字为cal。下一次数字就要去掉最高和最低两个位。这个时候就需要首先该数字对cal取模去掉最高位的数字,然后再除以10以去掉最低位的数字。 

    在求这个最高位对应的值时,我们需要对cal不断乘以10并将它和目标数字比较。这里容易导致的一个问题就是当目标数字比较大的时候,它容易导致溢出。所以在实现的时候应该声明为long类型,然后在后面的计算中再转换回来。

    根据讨论,得到代码如下:

 

public class Solution {
    public boolean isPalindrome(int x) {
        if (x < 0) return false;
        long t = 1;
        while (t * 10 <= x) t *= 10;
        int cal = (int) t;
        while (x != 0) {
            if (x % 10 != x / cal) return false;
            x = (x % cal) / 10;
            cal /= 100;
        }
        return true;
    }
}

 

 

总结

    问题的核心在于避免计算的过程中数字溢出。这也是最让人头疼和最容易出错的地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值