题目描述
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
解题思路
本题之前做过,利用数学规律进行数字反转。也比较简单。需要注意的点是,溢出问题,这个需要用边界来控制。上代码:
public int reverse(int x) {
// 利用十进制的特点
int rev = x % 10;
while ((x /= 10) != 0) {
// 由题目要求,还需要对溢出的情况进行判断
if (rev > Integer.MAX_VALUE/10
|| (rev == Integer.MAX_VALUE/10 && x % 10 > Integer.MAX_VALUE%10)) {
// 最大值
return 0;
// -313 -31
// -213 -21
} else if (rev < Integer.MIN_VALUE / 10
|| (rev == Integer.MIN_VALUE/10 && x % 10 < Integer.MIN_VALUE%10)) {
// 最小值
return 0;
}
rev = rev * 10 + (x % 10);
}
return rev;
}
后记
看了官方的答案,对数字这块的规律利用更加彻底。由于输入的数字是int,这意味着,最高位,也就是反转之后的最低位,在位数与最大值的位数相同的情况下,最高位只能是1或者2,也即是说,不需要判断rev == Integer.MIN_VALUE/10,因为最高位一定小于7.下次还得更加仔细!