LeetCode:整数反转(判断一个数是否超过Integer32位数的有效范围小技巧)
发布日期:2021-05-08 03:09:56 浏览次数:21 分类:精选文章

本文共 1577 字,大约阅读时间需要 5 分钟。

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

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

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

来源:力扣(LeetCode)

链接:
获取整数的反转,这一步相对简单,获取x这个数的最后一个数字n,然后进行sum = sum * 10 + n这一步代码,然后不断进行循环,从而得到x数字的反转。
这里最大的问题是如何判断反转后整数是否超过了32位有效数字的范围。通过官方题解,我们明白只要Integer.MIN_VALUE <= sum <= Integer.MAX_VALUE这个范围,那么sum就还没有超过32位有符号整数的范围,为什么是这样咧?
我们由上面整数反转中可以知道sum = sum * 10 + n,那么我们是否可以将Integer.MAX_VALUE也化成这样的形式咧?答案是当然可以了, Integer.MAX_VALUE = (Integer.MAX_VALUE / 10 ) * 10 + 7,所以这时候我们只要保证sum * 10 + n <= (Integer.MAX_VALUE / 10) * 10 + 7成立,那么就可以保证不会超过32位有效数字的范围了
通过化简,我们可以知道(sum - Integer.MAX_VALUE / 10) * 10 <= 7 - n即可,这时候,我们能分成3中情况.
①sum > Integer.MAX_VALUE/10,那么不等式必然不会成立
②sum = Integer.MAX_VALUE/10,那么不等式必然成立
③sum < Integer.MAX_VALUE/10,那么不等式必然成立
所以,我们可以得出结论,当sum <= Integer.MAX_VALUE / 10的时候,那么进行相加的时候整数必然不会超过32位有符号整数的范围.最小值也是这样分析的。
对应代码:

class Solution {       public int reverse(int x) {            int sum = 0,n;         boolean flag = x < 0 ? true : false;//flag表示x是否大于等于0         if(flag){                /*             如果x小于0,那么flag为true,这时候x取相反数,即x = -x,注意             不可以是x -= x,否则最后得到的就不是想要的结果,而是这一步之             后x变成0             */             x = -x;         }          while(x != 0){               n = x % 10;            if(sum < Integer.MIN_VALUE / 10 || sum > Integer.MAX_VALUE / 10)// Integer.MIN_VALUE / 10 <= sum <= Integer.MAX_VALUE / 10时,sum没有超过32位有符号数字的范围                return 0;            sum = sum * 10 + n;            x /= 10;         }         if(flag) //如果x是负数,那么最后反转的数字也应该是一个负数,所以需要将sum变成他的相反数            sum = -sum;         return sum;    }}

在这里插入图片描述

上一篇:散列表(哈希表)总结(C语言)
下一篇:LeetCode:环形链表(Java)

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月11日 11时02分44秒