【问题标题】:Reverse digits of an integer: How to find out if the number have overflown?整数的反转数字:如何找出数字是否溢出?
【发布时间】:2019-01-10 12:32:00
【问题描述】:

我正在尝试解决一个问题:

给定一个 32 位有符号整数,整数位反转,反转整数溢出时返回 0。

我的解决办法是:

public int reverse(int x)
{
    int reversedNumber = 0;
    boolean isNumberNegative = x < 0;
    x = Math.abs(x);
    while (x >= 10)
    {
        reversedNumber = reversedNumber * 10 + (x % 10);
        x = x / 10;
    }
    reversedNumber = reversedNumber * 10 + x;
    return isNumberNegative ? -1 * reversedNumber : reversedNumber;
}

我的问题是溢出,如果不使用Math 实用程序类或long 然后检查,我如何找出reversedNumber 是否溢出?

【问题讨论】:

  • 它的加法,并且解决方案要求使用数学实用程序类,我正在寻找一个不使用实用程序类的解决方案。
  • 识别所有可能溢出的输入,并分别处理。

标签: java integer


【解决方案1】:

您可以利用intlong 的转换,反之亦然,因为大于Integer.MAX_VALUE 且小于Integer.MIN_VALUEInteger.MIN_VALUE 在转换回int 时会溢出,这可以在最后两行中可以看到:

public int reverse(int x) {
    long reversedNumber = 0;
    boolean isNumberNegative = x < 0;
    x = isNumberNegative ? -x : x;
    while (x >= 10) {
        reversedNumber = reversedNumber * 10 + (x % 10);
        x = x / 10;
    }
    reversedNumber = reversedNumber * 10 + x;
    reversedNumber = isNumberNegative ? -reversedNumber : reversedNumber;

    int result = (int) reversedNumber ;
    return reversedNumber != result ? 0 : result;
}

【讨论】:

    【解决方案2】:

    您可以尝试这样做,无需任何转换:

    public int reverse(int x) {
        int reversedNumber = 0;
        int digitCount = 1;
        x = Math.abs(x);
        while (x >= 10) {
            if(digitCount >= 9 && willOverflow(reversedNumber)){
                return 0;
            }
            reversedNumber = reversedNumber * 10 + (x % 10);
            x = x / 10;
            digitCount++;
        }
        if(willOverflow(reversedNumber)){
            return 0;
        }
        reversedNumber = reversedNumber * 10 + x;
        if(reversedNumber < 0){
            return 0;
        }
    
        return reversedNumber;
    }
    
    private boolean willOverflow(int reversedNumber) {
        int tmpMultiply = reversedNumber * 10;
        int tmpDivide = tmpMultiply / 10;
        return tmpDivide != reversedNumber;
    }
    

    如果我相信您可以检查整数是否会溢出,方法是将其乘以 10,然后除以 10。如果最后的值与传递的值不同,您可以假设整数将在下一次迭代中溢出(如果有是下一次迭代)。

    【讨论】:

      猜你喜欢
      • 2017-10-28
      • 2017-04-08
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多