[LeetCode] 9. Palindrome Number (easy)

Welcome To My Blog

9. Palindrome Number (easy)

9.1.png
题目要求:检查给定的数字是否是回文数字
我的做法:把每个数字都存起来,然后首尾比较,从两头一直比到中间,这样做可以防止溢出(事实上没必要考虑溢出,因为对于正数来说,溢出后就是负数了,肯定不相等),时间复杂度和空间复杂度都是O(n),虽然AC了,但显然不合适.我的做法其实就是把数字分成两部分去比较这两部分是否相同,分成两部分去比较有个更好的方式,见第二个代码.
最优解:第二个代码和第三个代码,首推第二个
心得:要清楚循环每一轮都做的是什么,循环条件发生了什么改变

我的做法

//我的做法
    public static boolean isPalindrome(int x) {
        if (x < 0) return false;
        if (x < 10) return true;
        int len = String.valueOf(x).length();

        int[] each = new int[len];
        for (int i = 0; i < len; i++) {
            each[i] = x % 10;
            x = x / 10;
        }
        for (int i = 0; i < len / 2; i++) {
            if (each[i] != each[len - 1 - i]) return false;
        }
        return true;
    }

首推的最优解

  1. 改进的half converse:只翻转一半的话,很明显要考虑数字的位数是奇数还是偶数:偶数的话,两部分长度相同;奇数的话,两部长度差1
    • while(x>res)
    • return (x == res || x == res / 10); return的左边针对偶数情况,右边针对奇数情况
    • 清楚每一轮循环做什么,循环条件如何改变
      9.2.png
  2. complexity analysis:
    • time complexity: O(n/2),n指数字长度
    • space comlexity: O(1)
// 考虑溢出,只旋转一半
public boolean isPalindrome(int x) {
    if (x<0) return false;
    int res = 0;
    // 对于奇数 三位数肯定比两位数大
    // 对于偶数 正好翻转一半后跳出循环,比如1221,11
    // 对于偶数,如果是1211
    // 最重要的就是这个循环条件
    // 偶数的情况过一遍1221,1211,1231
    // 奇数的情况过一遍121,122
    while (x>res){
        res = res*10 + x%10;
        x = x/10;
    }
    // 这个return考虑11,222;121,23432奇偶两种情况
    return (x==res || x==res/10);
}

最优解

  1. 无需考虑溢出,因为对于正数来说,溢出后就是负数了,肯定不相等
    (负数溢出后是正数,这里不需要考虑)
    要利用的信息就是:溢出后与溢出前符号相反,肯定不等!
    思路:将数字完全翻转,与原数字比较即可,需要提供一个变量存储原数字
  2. complexity analysis:
    • time complexity: O(n)
    • space complexity: O(1)
    public boolean isPalindrome(int x) {
        if(x < 0) return false;
        int y = x;
        int res = 0;
        while(y != 0) {
            res = res * 10 + y % 10;
            y /= 10;
        }
        return x == res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值