题目:
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2的31次方, 2的31次方 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
思路:
步骤1:
最大的32位有符号整数为"2147483647"
最小的32位有符号整数为"-2147483648"
如果不了解的话我们可以利用Java代码去看看:
- 最大的32位有符号整数(咱自己创建类哈!):
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
}
- 最小的32位有符号整数:
public static void main(String[] args) {
System.out.println(Integer.MIN_VALUE);
}
就可以得到数值啦!
步骤2:
-
首先看看最大值:
-
一起思考如何反转呢?
反转的话我们需要将原来的数每个位分别取出,使用循环"while",当最后一次循环时数值会变成0。这里理解一下,比如将个位取出,需要原数对10取余,再乘与10,可以将个位向前翻一位,循环几次翻几位,最后一次循环可以把个位翻到第一位。获取十位是不是需要把原数除与10,再对十取余呢?当最后一位数,就是原数的最大位数对10取余后剩下的就为0了吧?
-
那么我们怎么判断我们是否超出范围了呢?
看一下这个数值,与最大值进行对比,如果倒数第二位大于"4"的话,那我们最后一位是谁都不重要了吧,都会超出范围,有人会想"那我不出现最后一位不就可以了吗?",那不出现最后一位while循环结束了呀,那就输出值了嘛?对吧!
-
-
-
-
再看看这三个数:
如果倒数第二个数没有超过范围的话,我们就要比较最后一个数了,这个想必大家都能理解的了。
-
这时候问题又来了:“为什么我们不直接判断第一个数大于2那就返回0呢,一定要倒数第二个”?
那。。。第一个是3 > 2,然后循环结束,返回一个0表示超出范围了?明显不可以吧!其他每位也是如此,至于倒数第二位就可以提前判断了,程序也变快了。算法不就是想要程序变快吗?
代码实现:
class Solution {
public int reverse(int x) {
int result = 0;
while (x != 0) {
int i = x % 10;
x /= 10;
//判断是否大于32位数
if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && i > Integer.MAX_VALUE % 10)) {
return 0;
}
//判断是否小于32位数
if (result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && i < Integer.MIN_VALUE % 10)) {
return 0;
}
result = result * 10 + i;
}
return result;
}
}