在 Leetcode 上反转大整数有问题吗?

Problem with Reversing Large Integers On Leetcode?

我正在研究 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,则基本上 return 0。不幸的是,这是错误的。

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

问题陈述要求 return 0 if 反转数不属于整数范围 :

If reversing x causes the value to go outside the signed 32-bit integer range [-2^31, 2^31 - 1], then return 0.

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

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

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

rev = rev * 10 + x % 10;

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

修复 ?

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

即使这可以做到,当最后一位数字是 2

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

2。将 rev 设为 long integer

这非常有效并且也被接受,但遗憾的是在解决这个问题时这不是预期的,因为声明明确要求不要使用 64 位整数

Assume the environment does not allow you to store 64-bit integers (signed or unsigned).

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位整数

Given a signed 32-bit integer x

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

Edit :正如大多数评论指出的那样,不要使用 pow(2,31),而是使用 INT_MAX 宏,因为它在这里就足够了。

 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);
    }