题目:回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: x = 121
输出: true
示例 2:
输入: x = -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: x = 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
分析
首先想到的是将数字转化成字符串,然后对字符串进行反转后比较来实现回文判断,如果不用转化字符串的方法的话,我们可以用同一个思路去思考,对数字的前后分别进行比较,例如12321,我们可以从后获取到21,并将21转化成12,再从前进行对比,如果是奇数位,则只需要对比前(n-1)/2项,因为只要前后相同,中间项数字是无关的。
具体过程
首先我们思考如何获取到例子12321中的最后几位,我们可以通过取模运算获得,例如12321%10=1,这样就得到了1,通过n来保存这个结果,再通过对12321/10的操作将当前位数变成4位,再通过取模,获得当前的模运算结果2,这样就有了1,2两个结果,因为如果是回文,那么1所在的位数一定是大于2的,并且越后获得的数字所在位数应该越小,所以我们应该给n赋值,n=1x10+2,如果还有更多位数,例如:
- 1234321,也是同样的操作:先对1234321取模,n=1,对1234321/10=123432,
- 再进行取模,n=1x10+2,再对123432/10=12343,
- 进行模运算得到3,有n=12x10+3=123,再对12343/10=1234,
- 取模4,有n=123x10+4=1234,1234/10=123, 此时我们已经对这数个超过其位数的一半进行了反转操作,就不需要再继续下去,我们只需要比较目前的123是否等于我们的n或者n/10,因为如果是奇数位的话,后面的数字会更多,就如1234321这个实例一样。
bool isPalindrome(int x){
if(x < 0 || (x != 0 && x % 10 == 0)){
return false;
}
int n = 0;
while(x > n){
n = n*10 + x%10;
x = x/10;
}
return x == n || x == n/10;
}