目录
一、问题描述
给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121
是回文,而 123
不是。
二、解题思路
解法 1:反转整数法
解题思路
- 回文数在正序和倒序时值相同,因此我们可以将整数的后半部分反转,然后与前半部分比较。
- 如果两个值相等,则说明这个整数是回文数。
- 为了避免溢出和不必要的反转操作,我们只需要反转整数的一半即可。反转一半后,比较它与剩下的前半部分是否相等。
代码
public class Solution {
public boolean isPalindrome(int x) {
// 特殊情况:负数不是回文数,或者以 0 结尾但不是 0 的数也不是回文数
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
// 初始化反转的数字
int revertedNumber = 0;
// 只需要反转原数的一半
while (x > revertedNumber) {
// 将当前 x 的最后一位数字添加到反转数字中
revertedNumber = revertedNumber * 10 + x % 10;
// 更新 x,去掉最后一位数字
x /= 10;
}
// 当 x 为偶数位时,反转后的数字应等于 x;当 x 为奇数位时,去掉反转数的最后一位应等于 x
return x == revertedNumber || x == revertedNumber / 10;
}
}
复杂度
-
时间复杂度:O(log(x)),因为我们每次把
x
除以 10,反转的过程与x
的位数相关。 -
空间复杂度:O(1),我们只使用了常数级别的额外空间。
解法 2:将整数转换为字符串并双指针法
解题思路
- 我们可以直接将整数转换为字符串,然后使用双指针从字符串的两端向中间移动,依次比较字符是否相等。
- 如果每个字符都相同,则这个整数是回文数。
代码
public class Solution {
public boolean isPalindrome(int x) {
// 如果 x 是负数,直接返回 false
if (x < 0) {
return false;
}
// 将整数转换为字符串
String str = Integer.toString(x);
// 使用双指针
int left = 0;
int right = str.length() - 1;
// 从两端向中间比较
while (left < right) {
// 如果左右字符不相等,返回 false
if (str.charAt(left) != str.charAt(right)) {
return false;
}
// 左指针向右移动,右指针向左移动
left++;
right--;
}
// 如果所有字符都匹配,返回 true
return true;
}
}
复杂度分析
- 时间复杂度:O(n),其中 n 是整数
x
转换成字符串后的长度。 - 空间复杂度:O(n),我们需要额外的空间来存储字符串。