题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
提示:下面案例可供参考
一、方案一
public boolean palindrome(int number) {
// 0的回文数是它本身,true
if(number == 0) return true;
// 负数的回文数有符号,false;个位数为0整数反过来首位为0,不是回文数
if(number<0 || number%10==0) return false;
int n = x; int num = 0;
// 反转
while (x!=0) {
num = num*10+x%10;
x = x/10;
}
return n == num;
}
提示: 此方法可能会出现数字翻转后溢出问题。因此有以下方案:
二、方案二
public boolean palindrome(int number) {
// 0的回文数是它本身,true
if(number == 0) return true;
// 负数的回文数有符号,false;个位数为0整数反过来首位为0,不是回文数
if(number<0 || number%10==0) return false;
int num = 0;
// 反转一半
while (x > num) {
num = num*10+x%10;
x = x/10;
}
// x==num是偶数位数字时,num%10==x是奇数位数字时。
return x == num || num%10 == x;
}
三、方案三
public boolean palindrome(int x) {
// 0的回文数是它本身,true
if(x== 0) return true;
// 负数x的回文数有符号,false;个位数为0整数反过来首位为0,不是回文数
if(x<0 || x%10==0) return false;
int n = (int)Math.pow(10,(x+"").length()-1);
while ((x+"").length()/2 > 0) {
if (x%10 != x/n) return false;
x = x%n;
if ((x+"").length()==1 || x==0) return true;
x=x/10;
if ((int)(x/Math.pow(10,(n+"").length() - (x+"").length()-2)) - x/Math.pow(10,(n+"").length() - (x+"").length()-2) !=0) return false;
if (((n+"").length() - (x+"").length()) !=1) {
x = (int) (x / Math.pow(10,(n+"").length() - (x+"").length()-2));
}
n = (int)Math.pow(10,(x+"").length()-1);
}
return true;
}
提示: 这种方法虽然也能解决问题,但是耗时较多。
四、方案四
public boolean palindrome(int x) {
// 0的回文数是它本身,true
if(x== 0) return true;
// 负数x的回文数有符号,false;个位数为0整数反过来首位为0,不是回文数
if(x<0 || x%10==0) return false;
char[] chars = (x+"").toCharArray();
for (int i=0;i<chars.length/2;i++) {
if (chars[i] != chars[chars.length-1-i]) return false;
}
return true;
}
提示 耗时是方案三的一半,方案二的二倍多。内存消耗和方案三不相上下,大于方案二消耗。