integer反向失败4例

mzmfm0qo  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(521)

出于某种原因,此代码仅在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;
    }
}
jckbn6z7

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。

相关问题