Given a 32-bit signed integer, reverse digits of an integer.

Example 1:

Input: 123
Output: 321

Example 2:

Input: -123
Output: -321

Example 3:

Input: 120
Output: 21

Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231,  231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

 
 
翻转数字问题需要注意的就是溢出问题,看了许多网上的解法,由于之前的 OJ 没有对溢出进行测试,所以网上很多人的解法没有处理溢出问题也能通过 OJ。现在 OJ 更新了溢出测试,所以还是要考虑到。为什么会存在溢出问题呢,由于int型的数值范围是 -2147483648~2147483647, 那么如果要翻转 1000000009 这个在范围内的数得到 9000000001,而翻转后的数就超过了范围。博主最开始的想法是,用 long 型数据,其数值范围为 -9223372036854775808~9223372036854775807, 远大于 int 型这样就不会出现溢出问题。但实际上 OJ 给出的官方解答并不需要使用 long,一看比自己的写的更精简一些,它没有特意处理正负号,仔细一想,果然正负号不影响计算,而且没有用 long 型数据,感觉写的更好一些,那么就贴出来吧:

解法一:

class Solution {
public:
int reverse(int x) {
int res = ;
while (x != ) {
if (abs(res) > INT_MAX / ) return ;
res = res * + x % ;
x /= ;
}
return res;
}
};

在贴出答案的同时,OJ 还提了一个问题 To check for overflow/underflow, we could check if ret > 214748364 or ret < –214748364 before multiplying by 10. On the other hand, we do not need to check if ret == 214748364, why? (214748364 即为 INT_MAX / )

为什么不用 check 是否等于 214748364 呢,因为输入的x也是一个整型数,所以x的范围也应该在 -2147483648~2147483647 之间,那么x的第一位只能是1或者2,翻转之后 res 的最后一位只能是1或2,所以 res 只能是 2147483641 或 2147483642 都在 int 的范围内。但是它们对应的x为 1463847412 和 2463847412,后者超出了数值范围。所以当过程中 res 等于 214748364 时, 输入的x只能为 1463847412, 翻转后的结果为 2147483641,都在正确的范围内,所以不用 check。

我们也可以用 long 型变量保存计算结果,最后返回的时候判断是否在 int 返回内,但其实题目中说了只能存整型的变量,所以这种方法就只能当个思路扩展了,参见代码如下:

解法二:

class Solution {
public:
int reverse(int x) {
long res = ;
while (x != ) {
res = * res + x % ;
x /= ;
}
return (res > INT_MAX || res < INT_MIN) ? : res;
}
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/7

类似题目:

String to Integer (atoi)

Reverse Bits

参考资料:

https://leetcode.com/problems/reverse-integer/

https://leetcode.com/problems/reverse-integer/discuss/4060/My-accepted-15-lines-of-code-for-Java

https://leetcode.com/problems/reverse-integer/discuss/4056/Very-Short-(7-lines)-and-Elegant-Solution

LeetCode All in One 题目讲解汇总(持续更新中...)

最新文章

  1. 【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信
  2. 使用delphi+intraweb进行微信开发2—intraweb以.net方式发布(以asp.net mvc4模式部署)在IIS(.net虚拟主机)上
  3. web应用程序传递连接字符串给FastReport数据源
  4. 3、CC2541芯片中级教程-OSAL操作系统(ADC光敏电阻和修改串口波特率)
  5. LoadRunner Pacing设置(转)
  6. 用非管理员权限启动主程序,并用管理员权限启动子程序,导致WM_COPYDATA消息发送失败的问题
  7. loadingDialog
  8. Ubuntu14.04搭建LAMP环境
  9. Angularjs入门学习一 简介
  10. HDU-1009(简单贪心)
  11. 移动端触摸滑动插件Swiper
  12. Css3渐变实例Demo(一)
  13. Memcached内存管理模型分析
  14. 百度云bcc建站
  15. Hive内置数据类型
  16. iOS关于蓝牙连接的简单介绍与使用
  17. IntelliJ IDEA 报错:找不到包或者找不到符号
  18. Python数据分析Pandas库之熊猫(10分钟一)
  19. 阿里妈妈前端团队出品的开源接口管理工具RAP第二代 http://rap2.taobao.org
  20. [jzoj]5257.小X的佛光

热门文章

  1. Tomcat配置https访问
  2. C++ 静态库与动态库以及在 Windows上 的创建、使用
  3. redis之主从同步
  4. Redis2.8之后主从复制的流程
  5. 一些优秀的 Entity Framework 开源项目
  6. python 处理中文遇到的编码问题总结 以及 字符str的编码如何判断
  7. 同时读取两个文件进行while循环
  8. python计算不规则图形面积算法
  9. JVM 学习总结
  10. Class文件和JVM的恩怨情仇