题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例
示例1
输入: 121 输出: true
示例2
输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例3
输入: 10 输出: false 解释: 从右向左读, 为 01 。因此它不是一个回文数。
分析
这个实际上和第七题有很大的相似之处,判断是否为回文数就是把这个数首先翻转过来,判断翻转后的数字和原来的数字是否相等,观察发现只要是输入负数,那么一定不会是回文数。对于非负数而言,如果直接采用第七题的方法,需要考虑溢出的问题,也就是如果翻转后的数字大于Integer.MAX_VALUE。所以可以对一半进行翻转,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。这样处理不仅可以解决溢出问题,还可以缩短翻转的位数。
那么如何判断反转数字的位数是否已经达到原始数字位数的一半?每次通过对10取余,取出最低位的数字,然后加到取出数的末尾,就是将revertNum乘以10,再加上这个余数,这样我们的翻转也就同时完成了,每取一个最低位数字,x都要自除以10。这样当revertNum大于等于x的时候循环停止。
代码实现
public class Palindrome_2 {
public boolean isPalindrome(int x) {
int temp = x;
int res = 0;
if(x < 0) {
return false;
}else {
while(temp > res) {
res = res * 10 + temp % 10;
temp = temp /10;
}
//如果是奇数的话,那么最中间的数字就在res的最低位上了,我们除以10以后应该和x是相等的
return x == res || x == res / 10;
}
}
public static void main(String[] args) {
Palindrome_2 pal = new Palindrome_2();
System.out.println(pal.isPalindrome(-121));
}
}
字符串实现
可以将该数字转换成字符串进行判断,这样思路会简单一点。将字符串与翻转过来的字符串进行比较,这样也不用担心溢出问题:
public class Palindrome_1 {
public boolean isPalindrome(int x) {
if( x < 0 ) {
return false;
} else {
//将int类型的数转换成字符串
StringBuffer x1 = new StringBuffer(String.valueOf(x));
x1.reverse();
String s = x1.toString();
String s1 = new String(String.valueOf(x));
if(s.equals(s1)) //不能用“==”
return true;
else
return false;
}
}
public static void main(String[] args) {
Palindrome_1 pal = new Palindrome_1();
System.out.println(pal.isPalindrome(121221));
}
}