题目描述
解题思路
- 解法一,将整个整数反转,然后与原整数比较
- 解法二,根据回文的特点,只需要比较右边一半反转后是否与左边一半相等,关键在如何判断反转数字已经达到原始数字位数的一半
- 解法三,双指针,指针
i
和j
分别从整数的第一位,和最后一位,依次i++
和j--
比较每个数字是否相同,关键在于如何获取一前一后的数字
需要注意的是
- 负数不作为回文数考虑,可以直接返回false
- 反转后的整数是否越界
- 解法二无需考虑越界情况,因为原整数不越界,一半位数的反转一定不会越界
Java
代码
//解法一
class Solution {
public boolean isPalindrome(int x) {
if(x < 0 ||(x % 10 == 0 && x != 0)){
return false;
}
int original = x; //记录x值
int rev = 0; //用于存储反转后的数
while( x != 0){
int pop = x % 10; //pop表示取出整数的最后一个数
//因为整数的最大值为:2147483647,最小值为:-2147483648
//如果一个数大于214748364,那么下一步rev = rev*10 一定越界;
//或者一个数等于214748364,并且pop > 7,那么下一步rev = rev*10 + pop也一定越界
if(rev > Integer.MAX_VALUE / 10||(rev == Integer.MAX_VALUE/10 && pop > 7)){
return false;
}
rev = rev*10 + pop; //把pop防到rev后面
x /= 10; //去掉整数的最后一个数,继续遍历
}
if(rev == original){
return true;
}
return false;
}
}
//解法二
class Solution {
public boolean isPalindrome(int x) {
if(x < 0 ||(x % 10 == 0 && x != 0)){
return false;
}
int res = 0;
//判断x是否大于res
while(x > res){
res = res * 10 + x % 10; //反转
x = x / 10; //原始数减去最后一位
}
/*
例如:
12321
res = 0 + 1 = 1
x = 1232
res = 1 * 10 + 2 = 12
x = 123
res = 12 * 10 + 3 = 123
x = 12
此时,x < 123
x = 12, res = 123 / 10 = 12
x == (res/10)
返回true
*/
//奇数时,我们需要去掉反转后整数的最后一位,在和x比较
return x == res || x == (res / 10);
}
}
//解法三
class Solution {
public boolean isPalindrome(int x) {
if(x < 0 ||(x % 10 == 0 && x != 0)){
return false;
}
int div = 1; //除数
while(x / div >= 10){
div *= 10;
}
while(x != 0){
int l = x / div; //左边的数字
int r = x % 10; //右边的数字
if(l != r) return false; //不等就返回false
x = (x % div) / 10; //去掉两边的数
div /= 100; //更新除数,因为去掉了两个数字,所以要除以100
}
return true;
}
}
Python3
代码
# 解法一
class Solution:
def isPalindrome(self, x: int) -> bool:
original = x
num = 0
if x < 0 or (x % 10 == 0 and x != 0):
return False
while x != 0:
num = num * 10 + x % 10
x = x // 10
if num > pow(2,31)-1 or num < pow(-2,31):
return False
if num == original:
return True
return False
# 解法二
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0 or (x % 10 == 0 and x != 0):
return False
res = 0
while x > res:
res = res * 10 + x % 10
x = x // 10
return x == res or x == (res // 10)
# 解法三
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0 or (x % 10 == 0 and x != 0):
return False
div = 1
while x // div >= 10:
div *= 10
while x != 0:
l = x // div
r = x % 10
if l != r:
return False
x = (x % div) // 10
div = div // 100
return True
C++
代码
//解法一
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0 ||(x % 10 == 0 && x != 0)){
return false;
}
int original = x; //记录x值
int rev = 0; //用于存储反转后的数
while( x != 0){
int pop = x % 10; //pop表示取出整数的最后一个数
if(rev > INT_MAX / 10||(rev == INT_MAX/10 && pop > 7)){
return false;
}
rev = rev*10 + pop; //把pop防到rev后面
x /= 10; //去掉整数的最后一个数,继续遍历
}
if(rev == original){
return true;
}
return false;
}
};
//解法二
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0 ||(x % 10 == 0 && x != 0)){
return false;
}
int res = 0;
//判断x是否大于res
while(x > res){
res = res * 10 + x % 10; //反转
x = x / 10; //原始数减去最后一位
}
return x == res || x == (res / 10);
}
};
//解法三
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0 ||(x % 10 == 0 && x != 0)){
return false;
}
int div = 1; //除数
while(x / div >= 10){
div *= 10;
}
while(x != 0){
int l = x / div; //左边的数字
int r = x % 10; //右边的数字
if(l != r) return false; //不等就返回false
x = (x % div) / 10; //去掉两边的数
div /= 100; //更新除数,因为去掉了两个数字,所以要除以100
}
return true;
}
};