Java 整数反转失败4例
出于某种原因,此代码仅在4种情况下失败,即当通过1534236469时,它应该返回0,但返回2147483647 编辑:代码应该反转其传递的值。如果给定123,则需要返回321Java 整数反转失败4例,java,integer,reverse,Java,Integer,Reverse,出于某种原因,此代码仅在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;
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;
}
}
类解决方案{
公共整数反转(整数x){
int val=x;
如果(val>=(Math.pow(2,31))| | val=0;i--){
int j=Integer.parseInt(“+c[i]);
总和+=(数学功率(10,幂)*j);
权力--;
}
如果(x您有未检测到的int
溢出
Math.pow(2,31)
是2147483648。类似地,Math.pow(-2,31)
是-2147483648。您尝试反转的值1534236469正好在这些范围内。因此,您的方法跳过了开头的if
语句,它可能返回0
然后,它尝试反转数字。反转的数字应该是9 646 324 351。但是这个数字太大,无法放入32位有符号的int
。Java所做的是丢弃最前面的位(最高有效位)。这必然会给我们一个无意义的结果。恰好是2 147 483 647(可装入int
的最大数字)
解决方案?一种方法是以long
而不是int
计算总和。这将确保没有溢出。如果要在int
溢出时返回0,则在结束时检查总和是否小于2^32,如果不小于,则返回0。为什么不使用Integer.MAX\u值和Integer.MIN_值而不是使用Math.Pow和幻数?要获取整数的最低位数并将其从整数中删除,int d=x%10
,然后x=x/10
。105表示d=5和x=10。