leetocde——Palindrome Number

这个题在leetcode上提示如下:

Could negative integers be palindromes? (ie, -1)

If you are thinking of converting the integer to string, note the restriction of using extra space.

You could also try reversing an integer. However, if you have solved the problem "Reverse Integer", you know that the reversed integer might overflow. How would you handle such case?

There is a more generic way of solving this problem.

我自己实测了一下,负数是永远不能被判为回文数的。思路其实很简答,就是从一个数的两边分别向中间靠拢,如果在对称位置上的两个数不相等,则不是回文数。

从右边获取某个位置上的数很简单,只需要不停地对10取模即可。从左边取数需要一点技巧,详情可见代码。注意,int表示的最大位数为10,如果要取第10位的数,那么pow(10, 10)对于int来说时溢出的,所以需要用long long类型来保存结果。

代码如下:

class Solution
{
public:
    bool isPalindrome(int x)
    {
        if (x < 0) return false;
        int bits_number = test_size(x);
        if (bits_number == 1) return true;

        int b = bits_number - 1;
        int x1 = x;
        int right, left;
        for (int i=0; i<bits_number/2; i++)
        {
            right = x1 % 10;
            left = x / my_pow(10, b) - x / my_pow(10, b+1) * 10;    //这里要考虑溢出问题
            if (right != left)
            {
                return false;
            }
            x1 = x1 / 10;
            b = b - 1;
        }

        return true;
    }

private:
    int test_size(int x)
    {
        int i;
        for (i = 0; x != 0; i++)
        {
            x = x / 10;
        }
        return i;
    }

    long long my_pow(int a, int b)      //考虑到溢出问题,返回值设为long long
    {
        if (b < 0) return 0;
        long long result = 1;
        for (int i=0; i<b; i++)
        {
            result = result * a;
        }
        return result;
    }
};


你可能感兴趣的:(leetocde——Palindrome Number)