题目
给你一个整数
x
,如果x
是一个回文整数,返回true
;否则,返回false
。
回文数
是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
提示:
- -231 <= x <= 231 - 1
思路
算法:
循环 O(1)
一个正整数的字符串表示是回文串,当且仅当它的逆序和它本身相等。负数因为负号的存在,不是回文串。
但如果直接做,会存在整数溢出的问题,比如1111111119的逆序是9111111111(大于INT_MAX
)。
所以我们要对其改进:我们只需先算出后一半的逆序值,再判断是否和前一半相等即可。
时间复杂度:int
型整数在十进制表示下最多有10位,对于每一位的计算是常数级的,因此总时间复杂度是 O(n) .
代码
C++代码:
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0 || x && x % 10 == 0) return false;
int s = 0;
while (s <= x)
{
s = s * 10 + x % 10;
if (s == x || s == x / 10) return true; // 分别处理整数长度是奇数或者偶数的情况
x /= 10;
}
return false;
}
};
python3代码:
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
res, p = 0, x
while p:
res *= 10
res += p % 10
p //= 10
return res == x