【力扣】整数反转,判断是否溢出的数学解法

整数反转原题地址

方法一:数学

反转整数

如何反转一个整数呢?考虑整数操作的3个技巧:

  1. xmod10 可以取出 x 的最低位,如 x=123 , xmod10=3 。
  2. x/=10 可以去掉 x 的最低位,如 x=123 , x/=10 , x=12 。
  3. x=x*10+y 可以在 x 后面续上 y ,其中 y 是一位数,如 x=123 , y=4 , x=x*10+y , x=1234 。

假设要反转的整数为 x ,反转后的整数存储在变量 rev 中, rev 一开始初始化为 0 ,那么反复执行以下操作:

  1. digit=xmod10 ,取出 x 的最低位数。
  2. x/=10 ,去掉 x 的最低位数。
  3. rev=rev*10+digit ,在 rev 后面续上 digit 。

直到 x 为 0 为止,此时 rev 存储的数据符合题目要求。

判断溢出

问题在于,如何判断插入后的数据是否超出 [INT_MIN,INT_MAX] 的范围,导致溢出?

我们来探索不等式 成立的充分必要条件。

先看右半边,即

对于任意整数 i ,我们有 ,如对于 123 , 123/10=12 , 123mod10=3 , 123=12*10+3 。

不等式化为: ,带入

移项化简得: ,记

  1. 当 rev=m 时,如果还要推入数字,那么 digit≤2 ,因为 INT_MAX 的最高位为 2 ,此时不等式左边等于 0 ,右边为正数,不等式恒成立。
  2. 当 rev>m 时,不等式左边至少是 10 ,右边至多是 7 ,不等式恒不成立。
  3. 当 rev<m 时,不等式左边至多是 -10 ,右边至少是 7-9=-2 ,不等式恒成立。

所以原不等式右半边成立的充分必要条件是 ,即 。同理左半边成立的充分必要条件是

原不等式成立的充分必要条件是

cpp 复制代码
// 方法一:数学
class Solution
{
public:
    int reverse(int x)
    {
        int rev = 0;
        while (x)
        {
            if (rev < INT_MIN / 10 || rev > INT_MAX / 10)
            {
                return 0;
            }

            // rev 后面续上 x 的最低位
            rev = rev * 10 + x % 10;
            // 去掉 x 的最低位
            x /= 10;
        }

        return rev;
    }
};
相关推荐
浅念-2 小时前
刷穿LeetCode:BFS 解决 Flood Fill 算法
数据结构·c++·算法·leetcode·职场和发展·bfs·宽度优先
做cv的小昊2 小时前
【TJU】研究生应用统计学课程笔记(8)——第四章 线性模型(4.1 一元线性回归分析)
笔记·线性代数·算法·数学建模·回归·线性回归·概率论
贾斯汀玛尔斯3 小时前
每天学一个算法--倒排索引(Inverted Index)
算法·inverted-index
小e说说3 小时前
打破偏科困境:这些学习软件助孩子重燃学习热情
算法
我命由我123453 小时前
程序员的心理学学习笔记 - 空杯心态
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
月昤昽4 小时前
autoCAD二次开发 4.正多边形与collection区分
算法·c#·二次开发·autocad二次开发
休息一下接着来4 小时前
C++ 固定容量环形队列实现
c++·算法
im_AMBER4 小时前
手撕hot100之矩阵!看完这篇就AC~
javascript·数据结构·线性代数·算法·leetcode·矩阵
笨笨饿4 小时前
#79_NOP()嵌入式C语言中内联汇编宏的抽象封装模式研究
linux·c语言·网络·驱动开发·算法·硬件工程·个人开发