链接:leetcode-cn.com/problems/pa…
1、题目:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例1
输入: 121
输出: true
示例2
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例3
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
你能不将整数转为字符串来解决这个问题吗?
2、分析
题干说明是判断一个 整数 ,并且不能将整数转换成字符串来处理。
由于回文数是一个对称的数,从左读和从右读都是一样的,因此,可以将这个回文数的各个位的数字进行翻转,再比较翻转后的数字与原数字是否相同,相同则是回文数,不同则不是回文数。
2.1、排除负数
由于处理的对象是整数,所以负数不可能是回文数
2.2、如何翻转数字
要获得一个整数的各个位数,可以采用整除和取余的方法,例如:整数121
- 取余:121 % 10 = 1,整除:121 / 10 = 12
- 取余:12 % 10 = 2,整除: 12 / 10 = 1
- 取余:1 % 10 = 1,整除: 1 / 10 = 0 (可作为取数的结束条件)
如上红色数字所示,所得到的1,2,1就是从右往左的各个位上的数字
2.3、将翻转后的数字按各位计算出来
此处应该要知道该数字有多少位,才能计算出来。也可以用整除的方式来。
2.4、解题步骤
到此,我们的解题思路就出来了,归纳如下:
1、排除负数
2、计算数字有多少位
3、翻转,获取各个位上的数字
4、将翻转后的数字按各位计算,与原数比较
3、代码
public class N9 {
public static void main(String[] args) {
int x = 12321;
System.out.println(new N9().isPalindrome(x));
}
public boolean isPalindrome(int x) {
if(x < 0){
return false;
}
//此处定义两个中间变量,避免原数被改变
int num1 = x;
int num2 = x;
//先算出有多少位
int size = 1;
while(num1 / 10 != 0){
size *= 10;
num1 = num1 / 10;
}
//再分别从右边取出每一位,得到反向输入的整数
int reverse = 0;
while(num2 != 0){
int right = num2 % 10;
reverse += right * size;
num2 = num2 / 10;
size = size / 10;
}
//最后对比是否相等
return x == reverse;
}
}