Easy!

题目描述:给定一个范围为 32 位 int 的整数,将其颠倒。

例1:

输入:132

输出:321

例2:

输入:-123

输出:-321

例3:

输入:120

输出:21

注意:假设我们的环境只能处理 32 位 int 范围内的整数。根据这个假设,如果颠倒后的结果超过这个范围,则返回 0。

解题思路:

翻转数字问题需要注意的就是溢出问题。由于之前的OJ没有对溢出进行测试,所以网上很多人的解法没有处理溢出问题也能通过OJ。现在OJ更新了溢出测试,所以还是要考虑到。为什么会存在溢出问题呢,我们知道int型的数值范围是 -2147483648~2147483647, 那么如果我们要翻转 1000000009 这个在范围内的数得到 9000000001,而翻转后的数就超过了范围。
我最开始的想法是,用long long 型数据,其数值范围为 -9223372036854775808~9223372036854775807, 远大于int型这样就不会出现溢出问题。代码如下:

C++参考答案一:

  1. /**
  2. * Correct but can refactor the code.
  3. */
  4. class Solution {
  5. public:
  6. int reverse(int x) {
  7. long long res = ;
  8. bool isPositive = true;
  9. if (x < ) {
  10. isPositive = false;
  11. x *= -;
  12. }
  13. while (x > ) {
  14. res = res * + x % ;
  15. x /= ;
  16. }
  17. if (res > INT_MAX) return ;
  18. if (isPositive) return res;
  19. else return -res;
  20. }
  21. };

提交通过后,OJ给出了官方解答,一看比自己的写的更精简一些,它没有特意处理正负号,仔细一想,果然正负号不影响计算,而且没有用long long型数据,感觉写的更好一些,那么就贴出来吧:

C++参考答案二:

  1. class Solution {
  2. public:
  3. int reverse(int x) {
  4. int res = ;
  5. while (x != ) {
  6. if (abs(res) > INT_MAX / ) return ;
  7. res = res * + x % ;
  8. x /= ;
  9. }
  10. return res;
  11. }
  12. };

在贴出答案的同时,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 / 10)

为什么不用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 long型变量保存计算结果,最后返回的时候判断是否在int返回内,参见代码如下:

C++参考答案三:

  1. class Solution {
  2. public:
  3. int reverse(int x) {
  4. long long res = ;
  5. while (x != ) {
  6. res = * res + x % ;
  7. x /= ;
  8. }
  9. return (res > INT_MAX || res < INT_MIN) ? : res;
  10. }
  11. };

下面这种方法是上面解法二的变形,其实也不难理解,因为都是用int型的,如果超出了范围,其除以10的结果就不会跟之前的结果一致,通过这点也可以进行区分,参见代码如下:

C++参考答案四:

  1. class Solution {
  2. public:
  3. int reverse(int x) {
  4. int res = ;
  5. while (x != ) {
  6. int t = res * + x % ;
  7. if (t / != res) return ;
  8. res = t;
  9. x /= ;
  10. }
  11. return res;
  12. }
  13. };

基础知识回顾:

一、

INT_MIN在标准头文件limits.h中定义。

  1. #define INT_MAX 2147483647
  2. #define INT_MIN (-INT_MAX - 1)

在C/C++语言中,不能够直接使用-2147483648来代替最小负数,因为这不是一个数字,而是一个表达式。表达式的意思是对整数21473648取负,但是2147483648已经溢出了int的上限,所以定义为(-INT_MAX -1)。

C中int类型是32位的,范围是-2147483648到2147483647 。 
(1)最轻微的上溢是INT_MAX + 1 :结果是 INT_MIN; 
(2)最严重的上溢是INT_MAX + INT_MAX :结果是-2; 
(3)最轻微的下溢是INT_MIN - 1:结果是是INT_MAX; 
(4)最严重的下溢是INT_MIN + INT_MIN:结果是0 。

二、

求数字的绝对值,vc++提供的库函数的支持,当必须包含:#include <math.h>

  1. 其中又分好几种类型:abs_abs64fabsfabsflabs_cabs。详细说明如下:
  1. //Calculate the absolute value.
  1. int abs(
  2. int n
  3. );
  4. long abs(
  5. long n
  6. ); // C++ only
  7. double abs(
  8. double n
  9. ); // C++ only
  10. long double abs(
  11. long double n
  12. ); // C++ only
  13. float abs(
  14. float n
  15. ); // C++ only
  16. __int64 _abs64(
  17. __int64 n
  18. );
  1. //Calculates the absolute value of the floating-point argument.
  1. double fabs(
  2. double x
  3. );
  4. float fabs(
  5. float x
  6. ); // C++ only
  7. long double fabs(
  8. long double x
  9. ); // C++ only
  10. float fabsf(
  11. float x
  12. );
  1. //Calculates the absolute value of a long integer.
  1. long labs(
  2. long n
  3. );
  1. //Calculates the absolute value of a complex number.
  1. double _cabs(
  2. struct _complex z
  3. );

以上函数的原型说明来自MSDN2008,可以看出,abs()函数有很多重载形式。一般用abs()就可以满足要求(c++),其它的各种都是一些特例。

LeetCode(7):颠倒整数的更多相关文章

  1. lintcode :reverse integer 颠倒整数

    题目: 颠倒整数 将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数). 样例 给定 x = 123,返回 321 给定 x = -123,返回 -321 解题: 直接 ...

  2. leetcode python两整数之和

    # Leetcode 371 两整数之和***### 题目描述 **不使用**运算符 `+` 和 `-` ​​​​​​​,计算两整数 `​​​​​​​a `.`b` ​​​​​​​之和. **示例1: ...

  3. [LeetCode] Integer Replacement 整数替换

    Given a positive integer n and you can do operations as follow: If n is even, replace n with n/2. If ...

  4. Java for LintCode 颠倒整数

    将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数). 解题思路: JAVA实现如下: public int reverseInteger(int n) { Boole ...

  5. Leetcode(力扣) 整数反转

    Leetcode 7.整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例: 输入: -123 输出: -321 注意: 假设我们的环境只能存储得下 32 位的有符 ...

  6. 力扣(LeetCode)颠倒二进制位 个人题解

    颠倒给定的 32 位无符号整数的二进制位. 示例 1: 输入: 00000010100101000001111010011100 输出: 0011100101111000001010010100000 ...

  7. python刷LeetCode:7. 整数反转

    难度等级:简单 题目描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321示例 3: ...

  8. Java实现 LeetCode 190 颠倒二进制位

    190. 颠倒二进制位 颠倒给定的 32 位无符号整数的二进制位. 示例 1: 输入: 00000010100101000001111010011100 输出: 0011100101111000001 ...

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

    题目:整数反转 题目来源:https://leetcode-cn.com/problems/reverse-integer 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示 ...

随机推荐

  1. list 删除一个元素的三种做法--python

    我们以一个字符串为元素类型的 list 为例,进行列表元素的删除: l = ['no surfing', 'flippers'] 法一:remove(val) >>> l.remov ...

  2. 即将上线的Kafka 集群(用CM部署的)无法使用“--bootstrap-server”进行消费,怎么破?

    即将上线的Kafka 集群(用CM部署的)无法使用“--bootstrap-server”进行消费,怎么破? 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.报错:org.a ...

  3. 约束Constraints--主键约束、外键约束、唯一约束、检查约束、默认约束、NOT NULL约束、列约束与表约束、创建约束、删除约束

    约束   Including Constraints 以下内容转自:https://www.cnblogs.com/wcl2017/p/7043939.html和http://blog.csdn.ne ...

  4. 运用Zabbix实现内网服务器状态及局域网状况监控(5) —— Zabbix监控路由器

    1. 首先在zabbix服务器端安装snmp工具 [root@zabbix ~]# yum -y install net-snmp-utils net-snmp-libs net-snmp-devel ...

  5. 【JUC】CountDownLatch

    因为在调用端的异步中,需要调用其他多个服务获取数据再汇总结果返回,所以用到了CountDownLatch CountDownLatch的概念 CountDownLatch是一个同步工具类,用来协调多个 ...

  6. 3 快速创建SpringBoot项目

    一.Intellij IDEA 创建Spring Boot项目 1.创建工程  2.选择Spring Initializr 3.设置Maven版本管理参数  4.选择引用模块  5.命名工程名 6.选 ...

  7. luogu P4162 [SCOI2009]最长距离

    传送门 可以枚举两个点然后计算答案,至于是否合法,就要看可不可以通过移不超过\(t\)个箱子使得两点连通,也可以看做找一条路径使得路径上的1个数不超过\(t\) 所以可以考虑最短路,相邻的点两两连边, ...

  8. python 新式类的 __getattribute__

    这个方法定义在object中,所以所有的新式类都继承有该方法,所有的新式类的实例在获取属性value的时候都会调用该方法,为了验证这一结论,我们重写一下该方法: class C(object): a ...

  9. C. Trailing Loves (or L'oeufs?)

    题目链接:http://codeforces.com/contest/1114/problem/C 题目大意:给你n和b,让你求n的阶乘,转换成b进制之后,有多少个后置零. 具体思路:首先看n和b,都 ...

  10. IMU 预积分推导

    给 StereoDSO 加 IMU,想直接用 OKVIS 的代码,但是有点看不懂.知乎上郑帆写的文章<四元数矩阵与 so(3) 左右雅可比>提到 OKVIS 的预积分是使用四元数,而预积分 ...