数学LeeCode7.整数反转

Posted chenry777

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学LeeCode7.整数反转相关的知识,希望对你有一定的参考价值。

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

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

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

在这里插入图片描述

题解一:修改最终rev类型为long

第一反应就是, 取余得到个位数,然后除以 10 去掉个位数,然后用一个变量保存倒置的数。

  • 一个整数%10得到该整数的个位数,/10得到该整数的前几位(除最后一位),要实现整数的翻转,只需要在以整数x!=0为条件的循环体内,令y = x%10 , x /= 10 ,rev = 0 , rev = rev*10+ y 即可

并且要考虑到返回值rev的范围 [−2147483648,2147483647],所以在输出前作一个判断。

class Solution {
    //解法1.修改最终rev类型为long
    public int reverse(int x) {
        long rev = 0;
        while(x != 0) {
            int y = x % 10;
            x /= 10;
            rev = rev * 10 + y;
        }       

        if (rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE) return 0;
        return (int)rev;
    }
}

时间复杂度:

10^(n-1) = x   =>     n-1 = log10(x)   =>    n=log10(x) + 1

所以时间复杂度是:O(log(x))

空间复杂度:O(1)

题解二:在rev * 10 前判定rev的值

1.对于大于 intMax 的讨论,此时 x 一定是正数,y 也是正数。

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

2.对于小于 intMin 的讨论同理。

class Solution {
    //解法2.在rev * 10 前判定rev的值
    public int reverse(int x) {
        int rev = 0;
        while(x != 0) {
            int y = x % 10;
            x /= 10;
            if (rev > Integer.MAX_VALUE/10 || rev < Integer.MIN_VALUE/10) return 0;
            rev = rev * 10 + y;
        }       
        return rev;
    }
}

时间复杂度和空间复杂度同上

题解三:计算digit位数来作为翻转循环判定条件

class Solution {
    public int reverse(int x) {
        long rev = 0;
        //总位数
        int digit = (int) (Math.log(x) / Math.log(10) + 1); 
        for (int i = 0;i < digit;i++){
            int y = x % 10;
            x /= 10;
            rev = rev * 10 + y;
        }

        if (rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE) return 0;
        return (int)rev;
    }
}

时间复杂度和空间复杂度同上

以上是关于数学LeeCode7.整数反转的主要内容,如果未能解决你的问题,请参考以下文章

7. 整数反转-数学

7. 整数反转-数学

7. 整数反转-数学

整数反转(数学)乘积最大子数组(数组动态规划)全排列 II(数组回溯)

LeetCode#7 整数反转(数学)

数学与数字3:整数反转-溢出的统一处理法则