【LeetCode】9. Palindrome Number(简单难度)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

判断是不是回文数,负数不是回文数。

解法一

把 int 转成字符串,然后判断是否是回文串做就可以了,缺点是需要额外的空间存储字符串,当然题目也告诉了不能这样,所以 pass 。

解法二

在第 7 道题写了倒置 int 的算法,这里当然可以用到了,只需要判断倒置前后相不相等就可以了。

当倒置后的数字超出 int 的范围时,我们返回的是 0,那么它一定不等于原数,此时一定返回 false 了,这正不正确呢?

我们只需证明,如果倒置后超出 int的范围,那么它一定不是回文数字就好了。

反证法,我们假设存在这么一个数,倒置后是超出 int 范围的,并且它是回文数字。

int 最大为 2147483647,
在这里插入图片描述
让我们来讨论这个数可能是多少。

有没有可能是最高位大于 2 导致的溢出,比如最高位是 3,因为是回文串,所以最低位是 3,这就将导致转置前最高位也会是 3,所以不可能是这种情况。

有没有可能是第 2 高位大于 1 导致的溢出,此时保持最高位不变,假如第 2 高位是 2,因为是回文串,所以个位是 2,十位是 2,同样的会导致倒置前超出了 int 的最大值,所以也不可能是这种情况。

同理,第 3 高位,第 4,第 5,直线左边的都是上述的情况,所以不可能是前边的位数过大。

为了保证这个数是溢出的,前边 5 位必须固定不变了,因为它是回文串,所以直线后的灰色数字就一定是 4,而此时不管后边的数字取多少,都不可能是溢出的了。

综上,不存在这样一个数,所以可以安心的写代码了。

class Solution {
    public int reverse(int x){
        int rev = 0;
        while(x != 0){
            int pop = x % 10;
            x /= 10;
            if(rev > Integer.MAX_VALUE / 10) return 0;
            if(rev < Integer.MIN_VALUE / 10) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }

    public boolean isPalindrome(int x) {
        if(x < 0) return false;
        int rev = reverse(x);
        return x == rev;
    }
}

在这里插入图片描述

时间复杂度:O(log(x))
空间复杂度:O(1)

解法三

其实,我们只需要将右半部分倒置然后和左半部比较就可以了。比如 1221,把 21 转置和 12 比较就行了。

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) return false;
        int digit = (int)(Math.log(x) / Math.log(10) + 1); //总位数
        int revert = 0;
        int pop = 0;
        //倒置右半部分
        for(int i = 0; i < digit / 2; i++){
            pop = x % 10;
            revert = revert * 10 + pop;
            x /= 10;
        }
        if(digit % 2 == 0 && x == revert){
            return true;
        }
        if(digit % 2 != 0 && x / 10 == revert){
            return true;
        }
        return false;
    }
}

说明:
Math.log(M) 就可以计算以常数 e 为底数的的对数,当然如果想计算 log2M 的值,那就可以使用 Math.log(M)/Math.log(2) 来计算

在这里插入图片描述
时间复杂度:O(log(x))
空间复杂度:O(1)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玳宸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值