题目:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例1:
输入: 121
输出: true
示例2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
解题思想:
- 如果一个数是负数,第一位是“-”号,那么它一定不是回文数;
- 0是回文数;
- 除0外所有10的整数倍都不是回文数,因为数字的第一位不能为0;
- 如果一个回文数的位数为偶数,那么它前面一半的数字等于后面一半的数字反写,例如789987,前面一半是789,后面一半是987,反写则是789,所以相等;
- 如果一个回文数的位数为奇数,那么它前
的数字,等于剩余数字反写,再除以10取整,例如78987,前
个数字为78,剩余的数字为987,反写为789,除以10取整为78,所以相等;
- 算法的核心就是比较一个数的前半部分和后半部分,前半部分可以通过对原数字不断除10取整得到,后半部分的数字可以通过对10取余在反写得到,例如483648,除10,得48364,余8;再除10,得483,余4,前半部分为483,后半部分为8*10+4=84;再除10,得483,余6,前半部分为483,后半部分为(8*10+4)*10+6=846;
- 当后半部分的数字大于前半部分的数字时,就到了原数字的一半,算法结束。
代码实现
/**
* @author Zqllz
* 2018年7月24日
*/
import java.util.Scanner;
public class LeetCode009 {
public static void main(String[] args) {
//控制台输入方法
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = sc.nextInt();
boolean f = isPalindorome(num);
System.out.println(f);
}
public static boolean isPalindorome(int x) {
boolean flag = false;
//0是回文数,且除0外10的整数倍一定不是回文数
if (x<0 || (x%10==0 && x!=0)) {
return flag;
}
int tmp = 0;
//将原数字除 10取整,余数乘上 10相加
//当原始数小于反转后的数字时,就到了一半的位数
while(x>tmp) {
tmp = tmp*10 + x%10;
x /= 10;
}
//(x==tmp)对应数字位数为偶数,(x==tmp/10)对应数字位数为奇数
if(x == tmp || x == tmp/10) {
flag = true;
}
return flag;
}
}