反向整数leetcode - 如何处理溢出

CSn*_*erd 7 java algorithm reverse integer

问题是:整数的反转数字.

例1:x = 123,返回321

例2:x = -123,返回-321

您是否注意到反转的整数可能会溢出?假设输入是32位整数,则反向1000000003溢出.你应该如何处理这类案件?

抛出异常?很好,但如果抛出异常不是一种选择呢?然后,您必须重新设计该功能(即添加一个额外的参数).

我搜索的网站的解决方案是:

public class Solution {

     public static int reverse(int x) {
            int ret = 0;
            boolean zero = false;
            while (!zero) {
                ret = ret * 10 + (x % 10);
                x /= 10;      
                if(x == 0){
                    zero = true;
                }
            }
            return ret;   
        }

    public static void main(String[] args) {
        int s = 1000000003;
        System.out.println(reverse(s));
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,当s = 1000000003控制台打印-1294967295而不是3000000001.因此,如果我们不能使用异常,这个解决方案仍然无法解决溢出问题.这里有什么帮助?(虽然有一个提示:添加一个额外的参数,我仍然无法弄清楚我应该添加什么参数)

小智 15

除了int之外,不需要任何数据类型.只需确保当有一个增加数字的操作时,反转操作应该给你以前的数字.否则,就会溢出.

public int reverse(int x) {
    int y = 0;

    while(x != 0) {
        int yy = y*10 + x%10;

        if ((yy - x%10)/10 != y) return 0;
        else y = yy;

        x = x/10;   
    }
    return y;
}
Run Code Online (Sandbox Code Playgroud)

  • 对于 x=1534236469,这没有按预期返回 0 (2认同)

Jia*_* Li 9

在大多数具有微不足道问题的答案之上,int变量可能会溢出.您可以尝试:x = -2147483648作为参数.有一种简单的方法可以解决这个问题.将x转换为long,并检查结果是否> = Integer.MAX_VALUE,否则返回0.解决方案通过https://leetcode.com/problems/reverse-integer/上的所有测试用例

这是一个java版本.

public int reverse(int x) {
        long k = x;
        boolean isNegtive = false;        
        if(k < 0){
            k = 0 - k;
            isNegtive = true;
        }

        long result = 0;
        while(k != 0){
            result *= 10;
            result += k % 10;
            k /= 10;
        }

        if(result > Integer.MAX_VALUE) return 0;
        return isNegtive  ? 0 - ((int)result) : (int)result;
    }
Run Code Online (Sandbox Code Playgroud)

C#版本

    public int Reverse(int x)
    {
        long value = 0;
        bool negative = x < 0;
        long y = x;
        y = Math.Abs(y);

        while (y > 0)
        {
            value *= 10;
            value += y % 10;
            y /= 10;
        }

        if(value > int.MaxValue)
        {
            return int.MaxValue;
        }

        int ret = (int)value;

        if (negative)
        {
            return 0 - ret;
        }
        else
        {
            return ret;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Python版本

def reverse(self, x):                
    isNegative = x < 0
    ret = 0
    x = abs(x)
    while x > 0:
        ret *= 10
        ret += x % 10
        x /= 10
    if ret > 1<<31:
        return 0

    if isNegative:
        return 0 - ret
    else:
        return ret
Run Code Online (Sandbox Code Playgroud)


Xgh*_*05t 5

这是一个老问题,但无论如何让我也尝试一下!我刚刚在leetcode上解决了这个问题。通过此检查,您永远不会遇到任一方向的上溢/下溢,并且我认为该代码比所有列出的代码更简洁。它通过了所有测试用例。

public int reverse(int x) {
    int y = 0;
    while(x != 0) {
        if(y > Integer.MAX_VALUE/10 || y < Integer.MIN_VALUE/10) return 0;
        y *= 10;
        y += x % 10;
        x /= 10;
    }
    return y;
}
Run Code Online (Sandbox Code Playgroud)

  • @Leomord,我认为我这样做的原因是我们将在数字中添加 x % 10,因此将添加或减去 0-9,这可能会导致溢出/欠流,所以它的作用就像一个缓冲区为了允许这些值也被考虑在内,您也可以在乘法和预加法之后添加另一个 if 语句检查,并且不使用 div 除 10。 (2认同)

Ell*_*sch 0

public static int reverse(int x) {
  boolean pos = x >= +0;
  int y = (pos) ? x : -x;
  StringBuilder sb = new StringBuilder(
      String.valueOf(y));
  sb.reverse();
  int z = Integer.parseInt(sb.toString());
  return pos ? z : -z;
}

public static void main(String[] args) {
  for (int i = -10; i < 11; i++) {
    System.out.printf("%d r= '%d'\n", i, reverse(i));
  }
}
Run Code Online (Sandbox Code Playgroud)

输出

-10 r= '-1'
-9 r= '-9'
-8 r= '-8'
-7 r= '-7'
-6 r= '-6'
-5 r= '-5'
-4 r= '-4'
-3 r= '-3'
-2 r= '-2'
-1 r= '-1'
0 r= '0'
1 r= '1'
2 r= '2'
3 r= '3'
4 r= '4'
5 r= '5'
6 r= '6'
7 r= '7'
8 r= '8'
9 r= '9'
10 r= '1'
Run Code Online (Sandbox Code Playgroud)

你注意到 10 和 -10 的相反了吗?还是20?例如,您可以只返回一个字符串

public static String reverse(int x) {
  boolean pos = x >= +0;
  int y = (pos) ? x : -x;
  StringBuilder sb = new StringBuilder(
      String.valueOf(y));
  sb.reverse();
  if (!pos) {
    sb.insert(0, '-');
  }
  return sb.toString();
}

public static void main(String[] args) {
  for (int i = -10; i < 11; i++) {
    System.out.printf("%d r= '%s'\n", i, reverse(i));
  }
}
Run Code Online (Sandbox Code Playgroud)

正如我所期望的那样工作。