1. 首页
  2. Leetcode经典148题

leetCode-9-Palindrome-Number

题目描述(简单难度)

leetCode-9-Palindrome-Number

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

解法一

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

解法二

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

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

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

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

int 最大为 2147483647 ,

leetCode-9-Palindrome-Number

让我们来讨论这个数可能是多少。

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

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

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

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

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

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;
}

时间复杂度:和求转置一样,x 有多少位,就循环多少次,所以是 O(log(x)) 。

空间复杂度:O(1)。

解法三

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

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;
    }
    //奇数情况 x 除以 10 去除 1 位
    if (digit % 2 != 0 && x / 10 == revert) { 
        return true;
    }
    return false;
}

时间复杂度:循环 x 的总位数的一半次,所以时间复杂度依旧是 O(log(x))。

空间复杂度:O(1),常数个变量。

总结

这几天都比较简单,加油加油加油!。

作者:windliang

来源:https://windliang.cc

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:leetCode-9-Palindrome-Number

    链接:https://www.javajike.com/article/3149.html

« leetCode-8-String-to-Integer
leetCode-10-Regular-Expression-Matching»

相关推荐

QR code