在 Leetcode 上反转大整数的问题?

时间:2021-02-26 12:32:11

标签: c++ integer overflow

我正在从 Leetcode 解决这个问题,它要求反转数字同时保持在 +/-2^31 范围内。我检查了针对这个问题的其他解决方案,并从那里创建了我自己的解决方案。它适用于 10 到小于 99,999,999 的数字。不止于此(当尝试提交代码以移至下一个问题时)会抛出错误:

“第 17 行:字符 23:运行时错误:有符号整数溢出:445600005 * 10 不能用类型 'int'(solution.cpp)表示”

这是尝试提交代码时给出的输入:1534236469

我的代码

class Solution {
public:
    int reverse(int x) {
      int flag = 0;
      int rev = 0;
      if (x >= pow(2, 31)) {
          return 0;
      } else {
        if (x < 0) {
            flag = 1;
            x = abs(x);
        }
        while(x > 0) {
            rev = rev * 10 + x % 10;
            x /= 10;
        }
        if (flag == 1) {
            rev = rev*(-1);
        }
        
    return rev;    
    }  
    }
};

正如您从我的代码中看到的,我添加了一个 if 语句,如果数字大于 2^31,它基本上会返回 0。不幸的是,这是错误的。

谁能解释一下如何解决这个问题?提前致谢。

2 个答案:

答案 0 :(得分:2)

如果反转数不属于整数范围,则问题语句要求返回0:

<块引用>

如果反转 x 导致值超出有符号的 32 位整数范围 [-2^31, 2^31 - 1],则 return 0

在您的代码中,您检查了输入是否适合整数范围,但是当整数有 10 位数字且最后一位数字 >2(在某些情况下为 2)时,会出现极端情况。

让我们考虑输入 1534236469: 1534236469 < 2^31 - 1

因此程序按预期执行现在让我们跟踪程序执行的最后几步: rev = 964632435x = 1 在执行以下语句时出现问题:

rev = rev * 10 + x % 10;

现在,即使输入可以表示为整数 rev * 10 ,即 9646324350 大于整数范围并且应该返回的正确值是

修复?

1.让我们独立考虑 10 位数字的情况

尽管可以这样做,但当最后一位数为 2

时,它会引起不必要的并发症

2.使 rev 成为 long integer

这很好用,也被接受,但遗憾的是,在解决这个问题时,这不是预期的,因为语句明确要求不使用 64 位整数

<块引用>

假设环境不允许您存储 64 位整数(有符号或无符号)。

3.在乘以 10 之前检查?

这按预期工作。在将 rev 乘以 10 之前检查它是否为 >= (pow(2,31)/10)

while(x > 0) {
            if (rev >= pow(2, 31)/10 )
                return 0;
            rev = rev * 10 + x % 10;  
            x /= 10;
        }

我希望这能解决你的疑惑!!如果您发现有问题,请发表评论,因为这是我的第一个答案。

注意:下面的 if 语句是不必要的,因为输入总是一个 32 位整数

<块引用>

给定一个带符号的 32 位整数 x

if (x >= pow(2, 31)) {
          return 0;
      } 

编辑:正如大多数评论所指出的,使用 pow(2,31) 宏代替 INT_MAX,因为它在这里就足够了。

答案 1 :(得分:1)

 public static int reverse(int x) {
        boolean isNegative = false;
        if (x < 0) {
            isNegative = true;
            x = -x;
        }
        long reverse = 0;
        while (x > 0) {
            reverse = reverse * 10 + x % 10;
            x=x/10;
        }
        if (reverse > Integer.MAX_VALUE) {
            return 0;
        }
        return (int) (isNegative ? -reverse : reverse);
    }