leetcode: Palindrome Number

问题描述:

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;
    }
}

总结

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

猜你喜欢

转载自shmilyaw-hotmail-com.iteye.com/blog/2282507