题目:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
示例:给定x = 121 ,返回 true。 给定 x = -121 返回 false。
思路:反转整数。将整数的后半部分反转,如果反转后的结果跟前半部分相同,则说明是回文数。
例: 12321,我们如何拿到最后一位数字呢? 使用取余算法, 12321 % 10 = 1,于是我们拿到了最后一位数字后,接着拿倒数第二位数字,倒数第二位数字应该是由 1232 % 10
得来的,那么1232
是怎么来的,是根据12321 / 10
计算出来的。我们此时再通过计算,将后半段的每一位数字进行反转,得到出一个大的结果。但是我们怎么确保后半段的范围在哪?我们观察一下,当我们将后半段的数字进行反转后,如果前半段的数字小于等于后半段的数字,那么就说明,我们将后半段的数字已经全部反转了。 例 当我们拿到 3时,我们后半段数字的反转结果应该为: 123
,此时 前半段数字 12
小于后半段数字123
,就说明,后半段数字已经被我们反转完了。
代码实现:
public static boolean isPalindrome(int x){
// 负数永远不是回文数。如果一个大于0的整数最后一位为0,那么这个数组也不是回文数
if(x<0 || (x %10 ==0 && x!=0)){
return false;
}
int tag = 0;
while(x > tag){
// x % 10 拿到个位数字。 tag * 10 是用于 反转数字。
tag = x % 10 + tag * 10;
x = x / 10;
}
// x == tag % 10,是为了了防止出现我们上例中存在的123这种情况
//例:12321, tag = 123 , x = 12 ,我们通过 tag /10 去除原数字中出现的中位数的情况。
return x == tag || x == tag / 10
}