整数取反失败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 代替。