题目
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,
121是回文,而123不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
Java语言
java
class Solution {
public boolean isPalindrome(int x) {
// 负数或末尾为0(但本身不是0)一定不是回文
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int reversed = 0;
while (x > reversed) {
reversed = reversed * 10 + x % 10;
x /= 10;
}
// 偶数位:x == reversed
// 奇数位:x == reversed / 10(中间数字不影响回文)
return x == reversed || x == reversed / 10;
}
}
核心思路: 只反转后半部分,与前半部分比较。这样既省空间又天然避免溢出问题。
逐行说明:
java
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
两种情况直接排除:
- 负数:
-121倒过来是121-,不是回文 - 末尾为 0 但本身不是 0:
10倒过来是01,不是回文(但0本身是回文)
java
int reversed = 0;
while (x > reversed) {
reversed = reversed * 10 + x % 10;
x /= 10;
}
不断从 x 末尾取数字拼到 reversed 上,同时 x 去掉末尾。关键条件 x > reversed :当 reversed 的位数达到或超过 x 的一半时停止。
例如 x = 1221:
| 轮次 | x | reversed | 说明 |
|---|---|---|---|
| 初始 | 1221 | 0 | |
| 1 | 122 | 1 | 取末尾 1 |
| 2 | 12 | 12 | 取末尾 2,x==reversed 停止 |
java
x == reversed → 12 == 12 → true
return x == reversed || x == reversed / 10;
两种情况:
- 偶数位 :
x == reversed,如1221→12 == 12 - 奇数位 :
x == reversed / 10,去掉中间那位。如121:
| 轮次 | x | reversed |
|---|---|---|
| 初始 | 121 | 0 |
| 1 | 12 | 1 |
| 2 | 1 | 12 |
x == reversed / 10 → 1 == 12 / 10 → 1 == 1 → true