整数取反失败4例
Integer Reverse fails 4 cases
出于某种原因,此代码仅在 4 种情况下失败,即当通过 1534236469 时,它应该是 return 0 但 returns 2147483647。
编辑:代码应该反转它传递的值。如果给出 123,则需要 return 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;
}
}
你有一个未检测到的 int
溢出。
Math.pow(2, 31)
是 2 147 483 648。类似地,Math.pow(-2, 31)
是 -2 147 483 648。您尝试反转的值 1 534 236 469 正好在这些范围内。所以你的方法跳过了开头的 if
语句,它可能 returned 0.
然后它会尝试反转数字。反过来应该是 9 646 324 351。但是这个数字太大了,无法放入带符号的 32 位 int
。 Java 所做的是丢弃最前面的位(最重要的位)。这势必会给我们一个无稽之谈的结果。恰好是 2 147 483 647( 可以 放入 int
的最大数字)。
解决办法?一种方法是在 long
而不是 int
中计算总和。这将确保您没有溢出。如果你想 return 0 以防 int
溢出,那么最后检查总和是否小于 2^32,如果不是,则 return 0 代替。
出于某种原因,此代码仅在 4 种情况下失败,即当通过 1534236469 时,它应该是 return 0 但 returns 2147483647。
编辑:代码应该反转它传递的值。如果给出 123,则需要 return 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;
}
}
你有一个未检测到的 int
溢出。
Math.pow(2, 31)
是 2 147 483 648。类似地,Math.pow(-2, 31)
是 -2 147 483 648。您尝试反转的值 1 534 236 469 正好在这些范围内。所以你的方法跳过了开头的 if
语句,它可能 returned 0.
然后它会尝试反转数字。反过来应该是 9 646 324 351。但是这个数字太大了,无法放入带符号的 32 位 int
。 Java 所做的是丢弃最前面的位(最重要的位)。这势必会给我们一个无稽之谈的结果。恰好是 2 147 483 647( 可以 放入 int
的最大数字)。
解决办法?一种方法是在 long
而不是 int
中计算总和。这将确保您没有溢出。如果你想 return 0 以防 int
溢出,那么最后检查总和是否小于 2^32,如果不是,则 return 0 代替。