当前位置: 首页 > news >正文

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

整数反转原题地址

方法一:数学

反转整数

如何反转一个整数呢?考虑整数操作的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] 的范围,导致溢出?

我们来探索不等式 INT\_MIN\leqslant n\leqslant INT\_MAX 成立的充分必要条件。

先看右半边,即 n\leqslant INT\_MAX 。

对于任意整数 i ,我们有 i=\left \lfloor \frac{i}{10} \right \rfloor\times 10+i mod 10 ,如对于 123 , 123/10=12 , 123mod10=3 , 123=12*10+3 。

不等式化为: \left \lfloor \frac{n}{10} \right \rfloor\times 10+n mod 10=\left \lfloor \frac{INT\_MAX}{10} \right \rfloor\times 10+INT\_MAX mod 10 ,带入 INT\_MAXmod10=7 , \left \lfloor \frac{n}{10} \right \rfloor=rev , nmod10=digit , 0\leqslant digit\leqslant 9 

移项化简得: (rev-\left \lfloor \frac{INT\_MAX}{10} \right \rfloor)\times 10\leqslant 7-digit ,记 \left \lfloor \frac{INT\_MAX}{10} \right \rfloor=m ,

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

所以原不等式右半边成立的充分必要条件是 rev\leqslant m ,即 rev\leqslant\left \lfloor \frac{INT\_MAX}{10} \right \rfloor 。同理左半边成立的充分必要条件是 rev\geqslant \left \lceil \frac{INT\_MIN}{10} \right \rceil 。

原不等式成立的充分必要条件是 \left \lceil \frac{INT\_MIN}{10} \right \rceil\leqslant rev\leqslant\left \lfloor \frac{INT\_MAX}{10} \right \rfloor 。

// 方法一:数学
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;}
};

http://www.lryc.cn/news/307084.html

相关文章:

  • Jmeter之内置函数__property和__P的区别
  • GPT润色指令
  • Ubuntu中matplotlib显示中文的方法
  • String类-equals和==的区别-遍历-SubString()-StringBuilder-StringJoiner-打乱字符串
  • IDEA的LeetCode插件的设置
  • 2024.2.29 模拟实现 RabbitMQ —— 项目展示
  • React htmlfor
  • 现代化数据架构升级:毫末智行自动驾驶如何应对年增20PB的数据规模挑战?
  • 理解Stable Diffusion、LoRA、Dreambooth、Hypernetworks、Textual Inversion、Checkpoint
  • spring boot3登录开发-2(1图形验证码接口实现)
  • 网络编程中的问题总结
  • 数据结构-关键路径
  • 进程间通信学习笔记(共享内存)
  • ChatGPT学习第三周
  • R语言混合效应(多水平/层次/嵌套)模型及贝叶斯实现技术应用
  • [C++]使用C++部署yolov9的tensorrt模型进行目标检测
  • eureka注册中心做了哪些事情/原理?
  • c语言经典测试题4
  • 设计模式(五)-观察者模式
  • MySQL-七种SQL优化
  • 针对Umi、React中遇到的 “xxxx”不能用作 JSX 组件 问题解决方案
  • 蓝桥杯备战刷题one(自用)
  • 设计模式(十) - 工厂方式模式
  • http协议基础与Apache的简单介绍
  • RabbitMQ的死信队列和延迟队列
  • PyQt 逻辑与界面分离
  • opengl播放3d pose 原地舞蹈脚来回飘动
  • Linux环境基础开发工具使用篇(三) git 与 gdb
  • mybatis---->tx中weekend类
  • Shell echo、printf、test命令