判断回文数

讲了两种方法,暴力反转法和反转一半的数字。

一,暴力反转法

限制

空间会开的浪费一点。并且可能超时(不推荐)

原理

一个回文数反转后也和它本身相等,可以先转换成一个字符串,然后再判断是否相等。

源代码

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

bool isPalindrome(int x)
{
    string s1 = to_string(x);

    string s2(s1);

    reverse(s1.begin(), s1.end());

    if (s1 == s2) return true;

    else return false;

}

二,反转一半的数字

适用

适用于回文数字,推荐。

原理

  • 后一半数字反转后与前一半数字相等。
  • 首先判断临界值
    • 1,x是负数,肯定不是回文数
    • 2,x大于0,并且最后一位是0(因为如果大于0,那么第一位一定不是0,最后一位肯定也不是0)。
  • 一直获取最后一位,直到原数据<=获取数据。
  • 最后返回
    • 数字长度为奇数时候,可以通过 revertedNum / 10去除中间的数字
    • 例如:12321 while循环结束后会得到x = 12,revertedNum = 123
    • 由于处于中间的数字不影响回文,可以将他去掉。

源代码

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

bool isPalindrome(int x)
{
    if (x < 0 || (x % 10 == 0 && x != 0))  return false;

    int revertedNum = 0;

    // 不断获取最后一位
    while(x > revertedNum)
    {
        revertedNum = revertedNum * 10 + x % 10;
        x /= 10;
    }
    return x == revertedNum || x == revertedNum / 10;
}
THE END