【LeetCode】0009——回文数

题目描述

在这里插入图片描述

解题思路

  • 解法一,将整个整数反转,然后与原整数比较
  • 解法二,根据回文的特点,只需要比较右边一半反转后是否与左边一半相等,关键在如何判断反转数字已经达到原始数字位数的一半
  • 解法三,双指针,指针 ij 分别从整数的第一位,和最后一位,依次 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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值