Java 输入字符串的NumberFormatException:";9646324351“;

Java 输入字符串的NumberFormatException:";9646324351“;,java,Java,下面是以下内容的快照: 对于此问题,他们提供了您必须填写的框架代码: public int reverse(int x) { } 在测试解决方案时,它似乎提供了不合理的输入,不允许我提交解决方案。错误是: 请注意,输入为1534236469。这适用于int作为输入,但反向版本9646324351自然不适用,因为Java中int的最大正值为2147483647 这只是LeetCode测试中的一个错误吗?还是有一些我无法想象的技巧,神奇地让我返回9646324351,一个明显超出范围的值,从r

下面是以下内容的快照:

对于此问题,他们提供了您必须填写的框架代码:

public int reverse(int x) {
}
在测试解决方案时,它似乎提供了不合理的输入,不允许我提交解决方案。错误是:

请注意,输入为
1534236469
。这适用于
int
作为输入,但反向版本
9646324351
自然不适用,因为Java中
int
的最大正值为
2147483647

这只是LeetCode测试中的一个错误吗?还是有一些我无法想象的技巧,神奇地让我返回
9646324351
,一个明显超出范围的值,从
reverse
返回为
int

这是我的代码,但代码几乎无关紧要,因为返回类型(
int
)是由问题解决的(所以“integer”实际上是指
int
,而不是
long
):

public int reverse(int x){
字符串intString;
StringBuilder sb=新的StringBuilder();
if(x<0){
某人加上(“—”);
x=x*-1;
}
intString=Integer.toString(x);
对于(inti=intString.length()-1;i>=0;i--){
sb.append(intString.charAt(i));
}
字符串resultString=sb.toString();
int result=Integer.parseInt(resultString);
返回结果;
}

您应该使用
Long.parseLong()
。这个数字对于整数来说太大了。整数的最大值为2^31-1=2147483647。

这是LeetCode测试中的错误。根本没有办法将他们要求的返回值存储在
int
中,因此没有办法根据提供的框架代码从
反向
返回

可能测试用例是在
int
的整个范围内随机生成的,没有考虑到
反向
会使
int
的值超出特定输入的范围


结果是,如果颠倒的数字超出范围,他们希望您返回
0
。并不是说他们费心去提问题中的任何地方。

我是用follow方法完成的

    int result=0;
    try{
        result = Integer.parseInt(stringBuilder.toString());
        return result;
    }catch(Exception e){
        return 0;
    }

我已经成功地提交了代码,但我仍然希望在运行速度和空间利用率方面进行优化。 你能分享一下你的想法吗

class Solution {
    public int reverse(int x) {
        String reverse;
        if(x==0 && x > Integer.MAX_VALUE && x < Integer.MIN_VALUE){return 0;}
        if(x<0){
            x = Math.abs(x);
            String temp = String.valueOf(x);
            int len = temp.length();
            reverse = "-";
            for(int i=len-1;i>=0;i--){
                reverse = reverse + temp.charAt(i);
            } 
        }else{
            String temp = String.valueOf(x);
            int len = temp.length();
            reverse = "";
            for(int i=len-1;i>=0;i--){
                reverse = reverse + temp.charAt(i);
            } 
        } 
        try{
        int rev = Integer.parseInt(reverse);
        return rev;
        }catch(Exception e){return 0;}
    }
}
类解决方案{
公共整数反转(整数x){
字符串反转;
如果(x==0&&x>Integer.MAX\u值&&x=0;i--){
反向=反向+温度特性(i);
} 
} 
试一试{
int rev=Integer.parseInt(反向);
返回版本;
}catch(异常e){return 0;}
}
}
运行时间:10毫秒,比反向整数的Java在线提交速度快8.10%。
内存使用:37MB,不到Java在线提交的反向整数的13.88%。

太大了。使用Long.parselong他仍然无法将结果放入他的变量中,因为它是int。该变量也需要是Long,而不是int@Fourth你不可能把数字9646324351放在
int
中,因为这个数字太大,不能放在
int
中。如果Leetcode要求您在
int
中准确地输入这个数字,那么他们给了您一个不可能完成的任务。我同意@Jesper的观点,int的上限在Java中是绝对的,是2147483647。如果Leetcode要求该数字为整数,则可能该数字不是9646324351,而您的号码是错误的。@Jesper不可能就是“问题”。这对我来说也没有任何意义,这就是我发布/编辑的原因。但不幸的是,S.O已经成为一个人们很容易无缘无故地被殴打的地方。谢谢你的帮助。我会投票支持你的评论(为什么这是一个CW答案:是我重新提出了这个问题。我不想看到任何不当行为的迹象。)我终于找到了问题的症结所在。显然,该测试用例是有意引入的,您应该测试32位int溢出,并在发生时返回0。你可以为了其他人而编辑答案,这可能对其他人有用。@Fourth:他们把那个小细节漏掉了,真可怜!因为这不仅仅是一个不合理的假设…它不是一个次要的细节,它是规范的一个重要部分,显然是缺失的。函数/方法的规范应该说明在无法计算答案或(在本例中)无法返回计算答案的情况下会发生什么。抛出IllegalArgumentException可能是另一个选项,但同样应该在规范中说明。你怎么能根据假设编写正确的代码?@Rodney:没错。(我是在挖苦人。:-)
class Solution {
    public int reverse(int x) {
        String reverse;
        if(x==0 && x > Integer.MAX_VALUE && x < Integer.MIN_VALUE){return 0;}
        if(x<0){
            x = Math.abs(x);
            String temp = String.valueOf(x);
            int len = temp.length();
            reverse = "-";
            for(int i=len-1;i>=0;i--){
                reverse = reverse + temp.charAt(i);
            } 
        }else{
            String temp = String.valueOf(x);
            int len = temp.length();
            reverse = "";
            for(int i=len-1;i>=0;i--){
                reverse = reverse + temp.charAt(i);
            } 
        } 
        try{
        int rev = Integer.parseInt(reverse);
        return rev;
        }catch(Exception e){return 0;}
    }
}