int溢出 java_Java int 溢出判断 7. Reverse Integer

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;

}

测试通过!

f2f62a16e951

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值