回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121 是回文,而 123 不是。

要求

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false

原题链接:回文数

完全判断

正常思路来说需要将这个整数 x 翻转后判断是否相等

比如 12345,翻转后是 54321,判断不相等,不是回文数;

又比如 12321,翻转后同样是 12321,判断相等,是回文数

判断一半

但这为了减少操作的次数,可以只判断一半

比如偶数情况:123345,反转到 543(一半)时判断 543 和 123 不相等,不是回文数

奇数情况:12321,反转到一半是 123,另一半是 12,则 123/10==12 ,是回文数;或者说反转到一半是 12,另一半是 123,则12==123/10 ,是回文数

代码实现

实现思路(用变量 y 来记录反转后的数)

  • 比如说 x=12321
  • 第一轮:x%10=1 ; x/10=1232 ;
    • 此时 x=1232 ;y 应为 1,即 0*10+1
  • 第二轮:x%10=2,x/10=123
    • 此时 x=123 ;y 应为 12,即 1*10+2
  • 第三轮:x%10=3,x/10=12
    • 此时 x=12 ;y 应为 123,即 12*10+3
  • 这时候已经反转了一半了,此时 x=12,y=123,那么判断不再反转的条件应该是 x<y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public boolean isPalindrome(int x) {
// 优先排除负数和个位是0的数,0也是回文数
if (x < 0 || (x != 0 && x % 10 == 0)) {
return false;
}
// 变量y用来记录反转后的的数字
int y = 0;
// 判断是否继续反转
while (x > y) {
y = x % 10 + y * 10;
x = x / 10;
}
// 不再反转后,判断是否是回文数
// x==y 为偶数情况 ;y / 10 == x为奇数情况,123/10==12
return x == y || y / 10 == x;
}
}