9-判断一个整数是否是回文数

题目:

9-判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:
输入 : 121
输出 : true

示例 2 :
输入 : -121
输出 : false
解释 : 从左向右读, 为 - 121 。 从右向左读, 为 121 - 。因此它不是一个回文数。

示例 3 :
输入 : 10
输出 : false
解释 : 从右向左读, 为 01 。因此它不是一个回文数。
进阶 :

你能不将整数转为字符串来解决这个问题吗?

解答:

方法一

依次/10得到每位数字,然后放到容器中,遍历比较

负数不可能为回文数

小于10的直接返回true

bool isPalindrome(int x) 
{
    if (x < 0)
        return false;    //负数不可能滴
    else if (x < 10)
        return true;
    
    vector<char> vec;
    while (x > 0)
    {
        vec.push_back(x % 10);
        x = x / 10;
    }
    for (int i = 0; i < vec.size()/2; i++)
    {
        if (vec[i] != vec[vec.size() - i - 1])
        {
            return false;
        }
    }

    return true;
}

效率较差,且占用内存较多

改进一:

  将依次得到的个位数倒序组成一个新的int,例如:12321,从右侧得到的数字依次组成123xx,最后判断是否与原输入相等。注意:在组成新数字时,需要判断是否溢出。

  个位数为零的也不可能是,因为最高位不可能为零。

bool isPalindrome2(int x)
{
    if (x < 0)
        return false;    //负数不可能
    else if (x < 10)
        return true;

    //个位为零的也不可能是,因为最高位不可能是0
    if (x % 10 == 0)
        return false;

    int y = 0;
    int tmp = x;
    while (tmp > 0)
    {
        if (y > INT_MAX / 10)//需要判断是否溢出!!!如果溢出了肯定不是,因为输入数字没溢出
            return false;
        y = y * 10 + tmp % 10;
        tmp = tmp / 10;
    }
    
    return x == y;
}

改进二:

上面的比较次数太多了,可以比较数字长度的一半:

bool isPalindrome3(int x)
{
    if (x < 0)
        return false;    //负数不可能
    else if (x < 10)
        return true;

    //个位为零的也不可能是,因为最高位不可能是0
    if (x % 10 == 0)
        return false;

    int y = 0;
    while (x > 0)
    {
        if (y > INT_MAX / 10)//需要判断是否溢出!!!如果溢出了肯定不是,因为输入数字没溢出
            return false;
        y = y * 10 + x % 10;
        x = x / 10;

        if (y == x)
            return true;
        else if (y > x)
        {
            y /= 10;
            return x == y;
        }
    }

    return false;
}
原文地址:https://www.cnblogs.com/zyk1113/p/13952470.html