题设
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
要点
- 32位补码,-2147483648---2147483647,正转负注意判断溢出
- 转换过程中,也要注意溢出
思路比较简单,首先把负数转化为正数处理,假设转化为正数后为x。
但是!这里要注意,32位整数的范围是-2147483648---2147483647,所以在取反前要判断负数是不是-2147483648,是的话肯定会溢出,返回0!
转化为正数后,有:result = (result + x % 10) * 10,x = x / 10。result初始为0。循环到x / 10<10,再加上最后的个位数x即可。
那么如何判断溢出呢?在更新result之前,我们可以记录一个lastResult = result + x % 10。这样,如果更新完后的result / 10 != lastResult,则发生了溢出。即:
lastResult = result + x % 10;
result = (result + x % 10 ) * 10;
if(lastResult != result / 10)
return 0;
public static int reverse(int x){
if(x == -2147483648) // 32位整数范围是-2147483648---2147483647,所以如果输入的是-2147483648,一取反就溢出了
return 0;
int flag = 0; // 是否为负数
int value = x;
if(x < 0){
flag = 1;
value = -value; // 负数转化为正数处理
}
int result = 0;
int lastResult = 0; //result乘上10后再除以10,判断是否和之前相等。如果不相等则溢出了
while(value >= 10){
int tail = value % 10;
lastResult = result + tail;
result = (result + tail) * 10;
if(result / 10 != lastResult) // 溢出
return 0;
value /= 10;
}
if(flag == 0)
return result + value;
else
return -(result + value);
}