题目描述
这是
LeetCode
上的 这是LeetCode
上的 7. 整数反转,难度为 简单。关键字:
数字
、反转
给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32
位的有符号整数的范围 [-231, 231 – 1],就返回 0
。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
复制代码
示例 2:
输入:x = -123
输出:-321
复制代码
示例 3:
输入:x = 120
输出:21
复制代码
示例 4:
输入:x = 0
输出:0
复制代码
提示:
-231 <= x <= 231 – 1
划重点
- 数字有负数
- 反转之后的数字有大小限制,不能超过
int
类型的范围
解题思路
首先对一个整数反转的时候,我们可以先获取到最后一位,作为第一位存储,之后每次拿数的时候往前一位,最终的数字 = 之前的数字 * 10 + 当前压入的数字。
class Solution {
public int reverse(int x) {
// 定义反转之后的数字
int ans = 0;
int tmp;
while (x != 0) {
// 取最后一位数字
tmp = x % 10;
// 计算反转之后的数字
ans = ans * 10 + tmp;
// 去掉整数的最后一位
x /= 10;
}
return ans;
}
}
复制代码
这样基础代码我们就有了,但是我们发现,反转之后的数字可能会溢出,即超出了整形 Integer
的范围。
所以我们继续看上述代码,看是哪一步可能会出现问题,我们可以定位到 ans = ans * 10 + x % 10;
-
对于正数:溢出的表达式为
ans * 10 + x % 10 > Integer.MAX_VALUE
,对这个不等式转换求出反转结果溢出时上一步ans
的范围应该是ans > (Integer.MAX_VALUE - x % 10) / 10
-
对于负数:溢出的表达式为
ans * 10 + x % 10 < Integer.MIN_VALUE
,同样进行转换得到ans < (Integer.MIN_VALUE - x % 10) / 10
完整代码有:
class Solution {
public int reverse(int x) {
int ans = 0;
while (x != 0) {
if (x > 0 && ans > (Integer.MAX_VALUE - x % 10) / 10) {
return 0;
}
if (x < 0 && ans < (Integer.MIN_VALUE - x % 10) / 10) {
return 0;
}
ans = ans * 10 + x % 10;
x /= 10;
}
return ans;
}
}
复制代码
引用
我的 github
仓库已经同步建立,点击访问
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END