• 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;
        }
    }
    
  • 相关阅读:
    Java API学习
    Java接口类学习笔记
    TCP/IP协议族
    Web服务器
    Redis笔记
    Python知识总汇
    GIL锁
    day8
    day7
    day6
  • 原文地址:https://www.cnblogs.com/Asimple/p/16138042.html
Copyright © 2020-2023  润新知