[0007] 整数反转
- GitHub
- http://leetcode.xuezhisd.top/post/24a97166.html
- https://leetcode.com/problems/reverse-integer
- https://leetcode-cn.com/problems/reverse-integer
题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123 输出: 321
示例 2:
输入: -123 输出: -321
示例 3:
输入: 120 输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
Related Topics
题目解析
- 本题是一道模拟题,关键是对结果超出int32的情况的判断。
不确定性
- 明确末尾为0的情况处理
方法一:长整形法
分析
- 直接利用取模法模拟即可
思路
- 先利用取模法计算出结果,存储在长整型 int64中。
- 再去判断结果是否在int32范围内。
注意
- int32 的最大值和最小值分别是 2^31-1(2147483647), -2^31(-2147483648)
- 考虑负数
知识点
- 取模
- 模拟
- int32范围
- 2,16进制表示法
复杂度
- 时间复杂度O(1)
- 空间复杂度O(1)
代码
1 | typedef long long lld; |
方法二:数组法
分析
- 在上一题基础上加大难度,给出的初始值是int64,那么上方法一就不可以使用了,没有比int64更大的有符号整数了。
- 为了解决上述变形题型,我们用另一种方法解决本文的题目
- 题目的难点是在处理边界值,即结果超出int32范围的情况,如果能判出结果超出了范围,那么题目就解决了
- 初始值是int64的解法请读者自己思考
思路
- 首先我们可以知道结果(绝对值)的长度
- 如果长度小于len(2147483647) = 10,那么肯定不超出范围
- 再来讨论长度=10的情况
- 拿结果绝对值与2147483647从高到低逐位比较
注意
- 题目输入不可能是8463847412,-8463847412(不在int32范围内)
- 故也不可能出现翻转后变成2147483648
- 所以只要拿2147483647与翻转后的数组比较大小即可
- 出现前导0的情况,这里不影响结果
- 输入为负数的情况
知识点
- 数组
- 模拟
- 字符串比较大小
复杂度
- 时间复杂度O(1)
- 空间复杂度O(1)
代码
1 | // |