回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
bool isPalindrome(int x) {
/*由示例2可以得出当x<0时肯定不会是回文数
然后考虑得知当x的尾数为0时,除非x=0,不然肯定不会是回文数
所以可以实现得出2种必然不是的情况将其排除*/
if(x<0||(x%10==0&&x!=0)){
return false;
}
int c =0 ;
while(x>c){
c=c*10+x%10;
x/=10;
}
return x==c||x==c/10;
}
在这个解答方案里采用的是领扣里的官方解答方案“反转一半数字”
例:x=1221时,将其后一半的数字进行反转可得12,若与前一半数字相同即为同文数,而如何判断什么时候反转到一半就可以通过上面代码中的while循环得知。
设置循环条件为每次循环过后除10的x大于每次反转得出的数c,若数c的位数与经过数次循环后的x位数相同时,会出现3种情况。
-
x>c
即同位数时x>c,再进行一次循环,但这种情况可以看出必然不是回文数,所以可通过x==c||x ==c/10的条件直接得出false -
x=c
即同位数时x=c,推出循环,符合x == c||x==c/10直接得出true -
x<c
即同位数时x<c,该情况与1类似,可直接得出falsex == c的判断我们都清楚,那么x==c/10的判断又是什么呢?
当x为奇数时,在循环完后必然会出现c比x多一位的现象,但其为中位,完全不影响是否为回文数的判断,因讲起反转到c的个位,故通过/10将其丢弃在行比较。