题目描述
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
代码样例:
class Solution {
public:
bool isPalindrome(int x) {
}
};
思路
这道题第一个思路就是数字转为字符串,然后看循环字符串的一般长度进行比对就行了,代码如下:
代码
//转字符串,循环一半长度
class Solution {
public:
bool isPalindrome(int x) {
string str = to_string(x);
for(int i=0;i<str.length()/2;i++)
{
if(str[i]!=str[str.length()-1-i]) return false;
}
return true;
}
};
也可以直接反转数字,比对两个数字
代码
//反转数字
class Solution {
public:
bool isPalindrome(int x) {
if(x<0) return false;
long temp = 0,xx=x;
while(x!=0)
{
temp = temp*10+x%10;
x=x/10;
}
if(xx==temp) return true;
else return false;
}
};
这种方法虽然也提交通过了,但存在一个问题,那就是反转过后的数字可能超过了有符号32位整数,即int所能表示的范围,存在缺陷。
结合前两种方法,其实可以反转数字的一半进行比对,但此时需要判断数字的位数是奇数还是偶数,这是一个需要注意处理的问题点。
很多人第一反应肯定是除10法进行循环来获取位数,但这样就导致时间开销表达,其实判断整数位数还有一个方法就是log后取整
代码
class Solution {
public:
bool isPalindrome(int x) {
if(x<0) return false;
int count = log10(x) + 1; //位数
int temp=0;
int i;
for(i=0;i<count/2;i++)
{
temp = temp*10+x%10;
x = x/10;
}
if(i*2!=count) //如果位数为奇数
{
x=x/10;
}
if(x==temp) return true;
else return false;
}
};