给定一个范围为 32 位 int 的整数,将其颠倒。

例 1:

输入: 123
输出: 321

例 2:

输入: -123
输出: -321

例 3:

输入: 120
输出: 21

注意:

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


 
您是否在真实的面试环节中遇到过这道题目呢?

是的
没有
 

转自 https://www.cnblogs.com/ariel-dreamland/p/8706403.html

解题思路:

由于之前的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 = 0;
8 bool isPositive = true;
9 if (x < 0) {
10 isPositive = false;
11 x *= -1;
12 }
13 while (x > 0) {
14 res = res * 10 + x % 10;
15 x /= 10;
16 }
17 if (res > INT_MAX) return 0;
18 if (isPositive) return res;
19 else return -res;
20 }
21 };

仔细一想,实验证明正负号不影响计算,而且没有用long long型数据,感觉写的更好一些,那么解法如下:

C++参考答案二:

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

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

C++参考答案四:

 1 class Solution {
2 public:
3 int reverse(int x) {
4 int res = 0;
5 while (x != 0) {
6 int t = res * 10 + x % 10;
7 if (t / 10 != res) return 0;
8 res = t;
9 x /= 10;
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>

其中又分好几种类型:abs、_abs64、fabs、fabsf、labs、_cabs。详细说明如下:
//Calculate the absolute value.
int abs(
int n
);
long abs(
long n
); // C++ only
double abs(
double n
); // C++ only
long double abs(
long double n
); // C++ only
float abs(
float n
); // C++ only
__int64 _abs64(
__int64 n
);
//Calculates the absolute value of the floating-point argument.
double fabs(
double x
);
float fabs(
float x
); // C++ only
long double fabs(
long double x
); // C++ only
float fabsf(
float x
);
//Calculates the absolute value of a long integer.
long labs(
long n
);
//Calculates the absolute value of a complex number.
double _cabs(
struct _complex z
);

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

Leetcode-颠倒整数的更多相关文章

  1. lintcode :reverse integer 颠倒整数

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

  2. LeetCode:整数转罗马数字【12】

    LeetCode:整数转罗马数字[12] 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 10 ...

  3. 前端与算法 leetcode 7. 整数反转

    目录 # 前端与算法 leetcode 7. 整数反转 题目描述 概要 提示 解析 解法 算法 传入测试用例的运行结果 执行结果 GitHub仓库 # 前端与算法 leetcode 7. 整数反转 题 ...

  4. LeetCode(7):颠倒整数

    Easy! 题目描述:给定一个范围为 32 位 int 的整数,将其颠倒. 例1: 输入:132 输出:321 例2: 输入:-123 输出:-321 例3: 输入:120 输出:21 注意:假设我们 ...

  5. Java for LintCode 颠倒整数

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

  6. Leetcode 7. 整数反转(待整理)

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

  7. LeetCode 343. 整数拆分(Integer Break) 25

    343. 整数拆分 343. Integer Break 题目描述 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 每日一算法2019/5/2 ...

  8. 【LeetCode】整数反转【不能借助辅助空间,需要处理溢出】

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: ...

  9. LeetCode 343.整数拆分 - JavaScript

    题目描述:给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 题目分析 题目中"n 至少可以拆分为两个正整数的和",这个条件说 ...

  10. 【一起刷LeetCode】整数反转

    前言&絮叨 别人都忙着参加年会晒奖品,我却忙着写代码.每逢年底都要安排几个紧急项目,我什么时候能摆脱这种宿命. 在忙也不能忘记刷LeetCode,毛毛向前冲!!! 题目描述 给出一个 32 位 ...

随机推荐

  1. zip详解

    http://www.360doc.com/content/06/0915/14/10610_208147.shtml

  2. virtualbox主机与虚拟机之间互相通信教程

    前言 在使用虚拟机搭建集群时,需要实现虚拟机与虚拟机之间互相ping通,并且主机与虚拟机也可以互相ping通. 一.环境准备: 1.主机为win7 2.virtualbox下创建两台ubuntu虚拟机 ...

  3. python替换残缺的多域名图片网址

    在获取网站真是图片的时候,经常遇到图片链接残缺问题. 例如下图所示的情况: img标签中的图片链接是残缺的,如果这个网站域名又是多种情况的话,比如 http://sports.online.sh.cn ...

  4. Windows下Apache的下载安装启动停止

    一:下载 打开任意浏览器,输入网址:http://httpd.apache.org/ 进入如下界面: 我们选择最新版Apache httpd 2.4.12Released,点击Download,进入如 ...

  5. 敏捷冲刺每日报告二(Java-Team)

    第二天报告(10.26  周四) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...

  6. 亚马逊的PuTTY连接AWS出现network error connection refused,终极解决方案。

    使用PuTTY连接AWS的时候,一直出现network error connection refused.百度了这个问题,大家都说是SSH要设置成22.但是我已经设置过了,为什么还是遇到这个问题呢? ...

  7. 自己写编程语言-m语言

    一直对技术有很强的兴趣,终于,决定要写自己的语言(m语言).那就先从最简单的开始:解释执行器. 一套完整的语言包含的肯定不止解释执行器了,还要有编译器和IDE,也就还要有语法高亮.智能提示等,不过还没 ...

  8. RadioButton的图标改变大小(TextView也适用)

    RadioButton的图标大小并没有相应的布局参数,本文通过自定义属性的方式自定义RadioButton,实现控制图片大小. 本文要点: 自定义属性的使用. 解决RadioButton文字上.下.左 ...

  9. 【非官方】Surging 微服务框架使用入门

    前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架 ...

  10. JAVA_SE基础——44.抽象类的练习

    抽象类要注意的细节: 1. 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象 的函数..2. 如果一个类出现了抽象的函数,那么该类也必须 使用abstract修饰. ...