首页 > LeetCode 7. Reverse Integer

LeetCode 7. Reverse Integer

问题链接

LeetCode 7

题目解析

给定一个32位有符号整数,求其反转数字。

解题思路

如果是简单反转的话,那这道题就太简单了。题目要求判断溢出问题,32位int类型的范围是-2147483648~2147483647。数字反转过后是有可能超出范围的,此时应该返回0。

最简单的想法是,反转结果用long long表示,其范围远超int,这样在反转过程中不会出现溢出问题,最后加以判断范围即可。

参考代码

class Solution {
public:int reverse(int x) {bool flag = true;if (x < 0) {flag = false;x = -x;}long long res = 0;while (x > 0) {res = res * 10 + x % 10;x /= 10;}if (res > INT_MAX) return 0;if(flag) return res;else return -res;}
};

官方解法

官方的解答精简无比,有两点改进:

第一,没有处理正负号,为此特意去查了求余的特性,可参考负数求余运算,了解到C++在异号求余时尽可能让商大,所以在这里不影响计算,不过个人建议还是要区分正负号,因为在不同的情况下可能会因为这个小问题出错。

第二,没有用long long表示反转结果。想想也是,如果这一道题让你反转一个long long,你还有更大的类型吗?代码中直接用int表示反转结果,判断溢出条件也很是精妙。对此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)

想到输入的数范围在-2147483648~2147483647,计算INT_MAX / 10 = 214748364,如果res大于这个数,接下来的*10一定会超过范围;等于这个数,最后一位只可能是1或2,验证之后发现只能是1,2的话原数就超范围了,反转数也不会超过范围;小于这个数,*10之后不可能会超范围。

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

其他解法

针对于官方解法,我们可以改进我们最初的写法。比如:依然用long long保存反转数,不区分正负号,核心代码如下(不过依然建议不使用):

long long res = 0;
while (x != 0) {res = 10 * res + x % 10;x /= 10;
}
return (res > INT_MAX || res < INT_MIN) ? 0 : res;

当然,对于判断溢出,可以通过除以10,判断结果是否已刚才一致,更好理解一些。参考代码如下:

class Solution {
public:int reverse(int x) {int res = 0;while (x != 0) {int t = res * 10 + x % 10;if (t / 10 != res) return 0;res = t;x /= 10;}return res;}
};

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

本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


转载于:https://www.cnblogs.com/AlvinZH/p/8543481.html

更多相关:

  • 这两天在看小程序的地图,写写笔记记录一下 小程序官方文档提供的方法 https://mp.weixin.qq.com/debug/wxadoc/dev/api/location.html 腾讯地图提供的jssdk http://lbs.qq.com/qqmap_wx_jssdk/qqmapwx.html 根据提示使用腾讯地图jssdk...

  • 1.链接地址: http://bailian.openjudge.cn/practice/2739/ 2.题目: 总时间限制:1000ms内存限制:65536kB描述给定两个正整数a和b。可以知道一定存在整数x,使得x <= logab < x + 1输出x输入第1行是测试数据的组数n,每组测试数据占2行,分别是a和b。每组测试数据之...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • Gym - 102082Ghttps://vjudge.net/problem/2198225/origin对于数列中任意一个数,要么从最左边到它不递减,要么从最右边到到它不递减,为了满足这个条件,就要移动,而移动的最少步数就是逆序对数。所以这个数要么往左移动,要么往右移动,所以两个取最小就好了 #include

  • 雪花算法根据时间戳生成有序的 64 bit 的 Long 类型的唯一 ID 各 bit 含义: 1 bit: 符号位,0 是正数 1 是负数, ID 为正数,所以恒取 041 bit: 时间差,我们可以选择一个参考点,用它来计算与当前时间的时间差 (毫秒数),41 bit 存储时间差,足够使用 69 年10 bit: 机器码,能编...

  •   这是一篇很水的blog 扫雷 link 一道很水的dp,考虑上一上,这一行,与下一行是否有雷即可 #include #include #include #include using namespace std; inline long long read...

  • 题目链接:http://codeforces.com/problemset/problem/900/D 题意:   给定x,y,问你有多少个数列a满足gcd(a[i]) = x 且 ∑(a[i]) = y。   题解:   由于gcd(a[i]) = x,所以y一定是x的倍数,否则无解。   那么原题就等价于:问你有多少个数列a满足g...

  • P2429 制杖题 题目描述 求不大于 m 的、 质因数集与给定质数集有交集的自然数之和。 输入输出格式 输入格式:第一行二个整数 n,m。 第二行 n 个整数,表示质数集内的元素 p[i]。 输出格式:一个整数,表示答案,对 376544743 取模。 输入输出样例 输入样例#1:2 15 3 5 输出样例#1:60 说...