LeetCode - 7/9 整数反转/回文数

69 阅读2分钟

整数反转

题目

给你一个 32 位的有符号整数 `x` ,返回将 `x` 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 `[−231,  231 − 1]` ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

题目分析

本题第一反应就是,将整数对于10取余再依次乘以10即可得到反转的结果。 但是需要考虑反转过后的整数是否超过了最大的范围,导致溢出。

以正数进行举例 对于大于 intMax 的讨论,此时 x 一定是正数,pop 也是正数。

  • 如果 rev > intMax / 10 ,那么没的说,此时肯定溢出了。
  • 如果 rev == intMax / 10 = 2147483647 / 10 = 214748364 ,此时 rev * 10 就是 2147483640 如果 pop 大于 7 ,那么就一定溢出了。但是!如果假设 pop 等于 8,那么意味着原数 x 是 8463847412 了,输入的是 int ,而此时是溢出的状态,所以不可能输入,所以意味着 pop 不可能大于 7 ,也就意味着 rev == intMax / 10 时不会造成溢出。
  • 如果 rev < intMax / 10 ,意味着 rev 最大是 214748363 , rev * 10 就是 2147483630 , 此时再加上 pop ,一定不会溢出。

假设反转后的结果为rev,每次除以10取余结果为p,rev依次乘以10,则只需要判断是否满足 rev < Integer.Max_Value/10 = 213748364 不满足条件即为溢出。负数同理。

编码

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

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

回文数

题目

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

题目分析

可以直接使用数字反转,然后判断是否相等即可

    public boolean isPalindrome(int x){

        if (x < 0) {
            return false;
        }
        if (x < 10){
            return true;
        }
        int reverse = reverse(x);
        return reverse == x;
    }