• 每日一道 LeetCode (2):整数反转


    题目:整数反转

    题目来源:https://leetcode-cn.com/problems/reverse-integer

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

    示例 1:

    输入: 123
    输出: 321
    

    示例 2:

    输入: -123
    输出: -321
    

    示例 3:

    输入: 120
    输出: 21
    

    注意:

    假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31,  2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

    解题思路

    题目中对数字反转的结果有最大最小限制,这个限制实际上在 Java 中也是 int 类型的大小限制,把 [−2^31,  2^31 − 1] 这个公式计算一下,结果就是 [-2147483648, 2147483647] 。

    接下来的就只剩下一个问题了,如何把一个整数进行反转。

    我这里提供一个思路,我们对原数字除以 10 以后进行取模运算(取余数):

    大体思路就是上面这样,然后注意边缘值判断,代码基本上就按照这个思路来:

    public int reverse(int x) {
        int res = 0;
        while (x != 0) {
            // 先获取末尾数字
            int tmp = x % 10;
    
            if (res < -214748364 || (res == -214748364 && tmp < -8)) {
                return 0;
            }
    
            if (res > 214748364 || (res == 214748364 && tmp > 7)) {
                return 0;
            }
    
            res = res * 10 + tmp;
            x /= 10;
        }
        return res;
    }
    

    这种边界判断方式稍显笨重,我看了看别人的答案,看到一种溢出的判断思路,感觉不错分享下:

    public int reverse_1(int x) {
        int res = 0;
        while (x != 0) {
    
            if (res > 214748364 || res < -214748364) {
                return 0;
            }
    
            res = res * 10 + x % 10;
            x /= 10;
        }
        return res;
    }
    

    这个结果提交 LeetCode 以后,直接看到 LeetCode 说执行耗时超过 100% 的用户。

    简直意外的惊喜,这里的判断极限值的含义如下: 1463847412

    极限最大值是 2147483648 ,除以 10 以后是 214748364 ,这里当 res 是 214748364 时,输入的 x 只能是 1463847412 ,因为 2463847412 、 3463847412 这些数字本身已经 int 溢出了。

    思路非常巧妙,利用了 int 本身的溢出范围,限制了输入数据的大小,减少了需要判断的可能性。

  • 相关阅读:
    [置顶] 当今世界最受人们重视的十大经典算法
    Android入门:调用WebService
    Android入门:实现一个File存储的辅助类
    多线程下载辅助类实现
    在Java程序中设置代理
    配置EditPlus使其可以编译运行java程序
    Android入门:文件上传
    Resource is out of sync with the file system
    【入门算法】思维导图
    sharepoint2010 重建服务器场的方法
  • 原文地址:https://www.cnblogs.com/babycomeon/p/13401778.html
Copyright © 2020-2023  润新知