LeetCode No7 整数反转

题目

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

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

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

示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

示例 4:

输入:x = 0
输出:0

提示:

-2^31 <= x <= 2^31 - 1

思路

题目很简单其实就是数字反转,我们很容易就可以想到把当前数x不断的除10减少位数,然后模10取每位数;但是现在题目要求在反转的过程中,如果出现了超过Integer范围内的值,也就是小于-2^31 或者大于2^31-1,需要直接返回0,我们如何能确定什么时候会超过Integer的返回呢?
如果我们假设反转后的数num还没有超过最大值MAX_VALUE了,那么我们可以得到如下不等式:
num≤MAX_VALUE
题目要求不能以超过int的数存储,MAX_VALUE=2^31-1=2147483647,所以我们可以转化成如下不等式:
rev*10 + pop ≤ (MAX_VAULE/10)*10 + 7
合并后可得到如下不等式:
(rev-MAX_VALUE/10)*10 ≤ 7 - pop
分别考虑三种情况:

  1. rev<MAX_VALUE/10,由于pop<10,所以不等式成立;
  2. rev=MAX_VALUE/10,当且仅当 pop≤7 时,不等式成立。
  3. rev>MAX_VALUE/10,不等式是不成立的。

而对于第2种情况,由于x不超过 MAX_VALUE,因此pop不会超过MAX_VALUE的最高位,即pop≤2。也就是说不等式永远成立,也就是说只要rev > MAX_VALUE/10 时,如果还有下一次取数,那么就肯定会超过MAX_VALUE。
同理大于等于最小值的时候也是同样的证明方法,于是有如下结论

 if (rev > Integer.MAX_VALUE/10 ) return 0;
 if (rev < Integer.MIN_VALUE/10 ) return 0;

AC代码

点击查看代码
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;
    }
}
posted @ 2022-04-12 22:46  Asimple  阅读(21)  评论(0编辑  收藏  举报