尝试了所有通过测试用例的方法,但仍然只显示一个错误。我不知道如何纠正错误。
输入: 1534236469
实际输出: 1056389759
预期输出: 0
我不知道为什么我的代码没有给出输出 0。
class Solution
{
public static int reverse(int x)
{
boolean flag = false;
if (x < 0)
{
x = 0 - x;
flag = true;
}
int res = 0;
int p = x;
while (p > 0)
{
int mod = p % 10;
p = p / 10;
res = res * 10 + mod;
}
if (res > Integer.MAX_VALUE)
{
return 0;
}
if (flag)
{
res = 0 - res;
}
return res;
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int revinteger = reverse(x);
System.out.println(revinteger);
}
}
答案 0 :(得分:2)
语句 res > Integer.MAX_VALUE
永远不会为真,因为 res
是 int
数据类型。而且 int 永远不能大于 Integer.MAX_VALUE(MAX_VALUE 本身就是我们可以存储为 int 的最大值)。
使用 long
数据类型来反转数字,最后返回结果的整数值。
答案 1 :(得分:0)
if (res > Integer.MAX_VALUE)
如果它是整数的最大可能值,它怎么会比它大?您必须以另一种方式检测它。
一种方法是使用 long
数据类型而不是 int
。然后,它可以变得比 Integer.MAX_VALUE
大,并且该捕获将起作用。
否则,您可能会找到另一种方法来抓住那个案例。
答案 2 :(得分:0)
因为基于长的操作相对较慢,我只会使用 long
来做最后的检查,以确定是否即将发生溢出。
很明显,如果除最后一位以外的所有数字都颠倒了,则没有 int
会导致溢出。所以在返回值之前处理循环外的最后一位数字。 min 的边界情况首先被消除,以方便后续处理。现在只有 Integer.MAX_VALUE
与正数和负数有关。
public static int reverse(int v) {
if (v == Integer.MIN_VALUE) {
return 0; // guaranteed overflow if reversed.
}
int rev = 0;
long ovflLimit = Integer.MAX_VALUE;
int sign = v < 0 ? -1 : 1;
v *=sign;
while (v > 9) {
int digit = v % 10;
rev = rev * 10 + digit;
v/=10;
}
long ovfl = (long)(rev)*10+v;
return ovfl > ovflLimit ? 0 : (int)(ovfl)*sign;
}
答案 3 :(得分:0)
这个问题可以通过多种方式解决,但如果我们坚持使用 Java
和您的解决方案,那么正如一些答案中已经指出的那样,通过使用 int
条件 {{1 }} 永远不会是 if(res > Integer.MAX_VALUE)
。
因此,您不会得到预期的输出为 0。
您可以通过在 true
中转换值并检查它是否超出 long
限制,在反转最后一位数字之前进行检查。正如 WJS 所建议的那样。
如果你想坚持你的解决方案而不做太多改变,下面是相同的工作代码。
int