1、题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
2、思路:
这个问题比较讲究数学思维,并且对于特殊情况需要考虑周到。
思路如下:
1、第一反应就是将整数转换为字符串,然后检查字符串是否是回文。但创建字符串需要O(n)的(非常量)空间,这与题目的要求是不符合的。
2、第二个想法是,将整数本身逆序,然后将逆序后的整数和原来的整数进行比较。如果它们相同,那么一定是回文数。但是,需要注意的是,逆序后的数字可能>int.Max。这会导致溢出。
3、为了避免产生溢出问题,我们可以只逆序整数的一半。回文数的后半部分的逆序应该和回文数的前半部分相同。
举个例子,如果输入的是“1221”,我们可以将“1221”的后半部分从“21”逆序为“12”,并与“1221”的前半部分进行比较。
如果相同,那么就是一个回文数。
对于整数“1221”,通过“1221%10”,我们就可以得到最后一位“1”。可以把“1221/10 =122”,再“122%10”,我们就可以得到倒数第二位了。
重复这样的过程,直到这个整数的中间位置。但是对于“12321“的情况也要最终考虑周全。
4、现在问题的关键是,我们如何知道,我们已经到了这个整数的中间位置了。
当逆序后的数的值大于原来的值的时候,就到了这个整数的中间位置了!
3、代码
package _01_50;
public class _09PalindromeNumber{
public boolean isPalindrome(int num){
//special scene
if(num<0||((num%10==0)&&num!=0)) return false;
int revert = 0;
while(true){
revert = revert*10 + num%10;
num = num/10;
if(revert>=num) break;
}
if(revert == num){
return true;
}else if(revert/10 == num){
return true;
}return false;
}
public static void main(String[] arg){
_09PalindromeNumber PalindromeNumber = new _09PalindromeNumber();
int a = 121;
int b = 1221;
int c = 1234321;
int d = 123321;
int e = 1;
int f = 12;
System.out.println(PalindromeNumber.isPalindrome(a));
System.out.println(PalindromeNumber.isPalindrome(b));
System.out.println(PalindromeNumber.isPalindrome(c));
System.out.println(PalindromeNumber.isPalindrome(d));
System.out.println(PalindromeNumber.isPalindrome(e));
System.out.println(PalindromeNumber.isPalindrome(f));
}
}
参考:
LeetCode 9. 回文数