出于某种原因,此代码仅在4种情况下失败,即当传递1534236469时,它应该返回0,但返回2147483647。
编辑:代码应该反转它传递的值。如果给定123,则需要返回321。
class Solution {
public int reverse(int x) {
int val = x;
if(val >= (Math.pow(2,31))||val<= Math.pow(-2,31)){
return 0;
}
int sum = 0;
String str = ""+Math.abs(x);
char[] c = str.toCharArray();
int power = c.length-1;
for(int i = c.length-1;i>=0;i--){
int j = Integer.parseInt(""+c[i]);
sum+=(Math.pow(10,power)*j);
power--;
}
if(x<0){
sum=sum*-1;
}
return sum;
}
}
1条答案
按热度按时间jckbn6z71#
你有一个未被发现的
int
溢出。Math.pow(2, 31)
是2147483648。同样地Math.pow(-2, 31)
is-2147483648。您尝试反转的值,1534 236 469,正好在这些范围内。所以你跳过了if
语句的开头,它可能已返回0。然后它尝试反转数字。反过来应该是9646234351。然而,这个数字太大了,不适合32位有符号数字
int
. java所做的是丢弃最前面的位(最高有效位)。这一定会给我们一个无稽之谈的结果。恰好是2147483647(一个数字中能容纳的最大数字)int
).解决方案是什么?一种方法是计算一个
long
而不是一个int
. 这将确保您没有溢出。如果要在int
溢出,最后检查总和是否小于2^32,如果不小于,则返回0。