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