回文数(Leetcode 简单)
题目描述:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例1:
输入: 121
输出: true
示例2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
分析:
(1)x 为负数时,不是回文数;
(2)x 为一位数 0-9 时,则必为为回文数;
(3)当 x 大于 9 时,应该将 x 反转再判断,其中 x 最后一位若为 0,则必然不是回文数,不用再反转;
(4)当 x 反转时,可能会出现溢出,则不能使用反转;使用分块对比的方法,将 x 分成前后两块,即,将 x 从后反转作为新数字 temp,它是 x 后半块的反转,再与剩下的 x,即 x 的前半块判断。
注意:
当 x 为偶数位时正常反转,但当 x 位奇数位时,最终 temp 是要比 x 多一位,则去掉最后一位再与 x 判断。
答案:
#include <iostream>
using namespace std;
class Solution
{
public:
bool isPalindrome(int x)
{
if (x >= 0 && x < 10)
return true;
if (x < 0 || x % 10 == 0)
return false;
int temp = 0;
while (temp < x)
{
temp = temp * 10 + x % 10;
x = x / 10;
}
if (temp == x || temp / 10 == x)
return true;
else
return false;
}
};
int main()
{
int x;
cin >> x;
Solution a;
cout << boolalpha << a.isPalindrome(x);
return 0;
}
方法二:
可以使用 long 类型避免溢出,直接用反转判断即可。
class Solution
{
public:
bool isPalindrome(int x)
{
if (x < 0)
return false;
else
{
long num = 0;
int temp = x;
while (temp)
{
num = num * 10 + temp % 10;
temp /= 10;
}
if (int(num) != x)
return false;
else if (num == x)
return true;
else
return false;
}
}
};