题目:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
代码分析:
一个32位的有符号整数再经过翻转之后,可能会存在溢出(也就是超出了int的范围)的问题,所以我们要对这个问题进行处理;
那么我们就要思考什么时候会溢出呢?
经过分析,溢出有两种情况,一种是大于Integer.MAX_VALUE,另一种是小于Integer.MIN_VALUE,两种情况类似,所以我们分析一种即可;
我们在这里分析第一种情况;
result = result*10 + last;
result
为正值的情况下,如果result
大于Integer.MAX_VALUE / 10
,那么就一定会溢出,如果result
等于Integer.MAX_VALUE / 10
,那么,last如果大于Integer.MAX_VALUE % 10
也会产生溢出的情况。相反的,如果result
为负值,也是一样的原理;
Integer.MAX_VALUE是(2^31)-1也就是2147483647
Integer.MIN_VALUE是-2^31也就是-2147483648
代码中会写last>7 last<-8的原因是,Integer.MAX_VALUE和Integer.MIN_VALUE分别%10后的结果分别是7和-8;
此外还要注意的一点是 result = result*10 + last 这条语句的位置应该放在判断溢出的后面;
若放在前面,若result是没有溢出的数,且result和Integer.MAX_VALUE或Integer.MIN_VALUE的位数相同,则会出现返回0的情况,因为此时result一定是满足 >Integer.MAX_VALUE/10或者 <Integer.MIN_VALUE/10的。
class Solution {
public int reverse(int x) {
int result = 0;
while(x!=0){
int last = x % 10;//得到整数x的最后一位
x = x / 10;
/*两种溢出情况*/
if((result>Integer.MAX_VALUE/10)||(result==Integer.MAX_VALUE/10 && last > 7))
return 0;
if((result<Integer.MIN_VALUE/10)||(result==Integer.MIN_VALUE/10 && last <-8))
return 0;
result = result*10 + last;
}
return result;
}
}