Given a 32-bit signed integer, reverse digits of an integer. Leetcode
Example 1: Input: 123 Output: 321
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
这道题拿到题目后一直心算不出来,后来拿了张之后弄清楚了,自己的短期记忆能力下降好多啊。拿123、-123 都试了,都通过,就提交了。
public int reverse(int input) {
int factor =1;
int remainder = 1;
int output = 0;
while(factor != 0){
factor = input / 10;
remainder = input % 10;
output = output * 10 + remainder;
input = factor;
}
return output;
}
但是不对,当输入是1534236469时,反转结果大于int数据类型上限(-2^31 -1~2^31,即-2147483647 ~ 2147483648),应该返回0,但是我返回的是1056389759。
去网上搜了下,stackoverflow上有篇(How does Java handle integer underflows and overflows and how would you check for it?)讲到怎么检测整数上、下溢出。里面讲到一点,当上溢出时,从MIN_VALUE(-2^31 -1)开始,往上增加,下溢出时,从MAX_VALUE(2^31)开始,往下减小,这就是为什么我刚才那个方式还能有输出,而不是直接报错。大三的东西真是全忘了啊。
问答中提到在Java 8中, java.lang.Math 给 int 和 long提供有这几个方法: addExact, subtractExact, multiplyExact, incrementExact, decrementExact, negateExact,当溢出的时候会 throw ArithmeticException。所以把最后一步拆分位两部分,用这类方法来。
public int reverse(int input) {
int factor =1;
int remainder = 1;
int output = 0;
try{
while(factor != 0){
factor = input / 10;
remainder = input % 10;
output = Math.multiplyExact(output, 10);
output = Math.addExact(output, remainder);
input = factor;
}
}catch(Exception e){
return 0;
}
return output;
}
测试通过!
image.png