我正在从 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。不幸的是,这是错误的。
谁能解释一下如何解决这个问题?提前致谢。
答案 0 :(得分:2)
如果反转数不属于整数范围,则问题语句要求返回0:
<块引用>如果反转 x
导致值超出有符号的 32 位整数范围 [-2^31, 2^31 - 1]
,则 return 0
。
在您的代码中,您检查了输入是否适合整数范围,但是当整数有 10 位数字且最后一位数字 >2(在某些情况下为 2)时,会出现极端情况。
让我们考虑输入 1534236469
: 1534236469 < 2^31 - 1
因此程序按预期执行现在让我们跟踪程序执行的最后几步: rev = 964632435
和 x = 1
在执行以下语句时出现问题:
rev = rev * 10 + x % 10;
现在,即使输入可以表示为整数 rev * 10
,即 9646324350
大于整数范围并且应该返回的正确值是 零
尽管可以这样做,但当最后一位数为 2
时,它会引起不必要的并发症rev
成为 long integer
这很好用,也被接受,但遗憾的是,在解决这个问题时,这不是预期的,因为语句明确要求不使用 64 位整数
<块引用>假设环境不允许您存储 64 位整数(有符号或无符号)。
这按预期工作。在将 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);
}