在 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 = 964632435
和 x = 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);
}
我正在研究 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]
, thenreturn 0
.
在您的代码中,您检查了输入是否在整数范围内,但当整数有 10 位且最后一位 >2(在某些情况下为 2)时,它们会出现极端情况。
让我们考虑输入 1534236469
:1534236469 < 2^31 - 1
所以程序按预期执行现在让我们跟踪程序执行的最后几个步骤: rev = 964632435
和 x = 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);
}