java - 找到最大的数。描述 - 给定一个非负整数列表,将它们排列成最大的数
问题描述
例如。给定 [3, 30, 34, 5, 9],最大的形成数是 9534330。
注意:结果可能非常大,所以需要返回字符串而不是整数。
public class Solution {
public String largestNumber(final List<Integer> A) {
String s = Integer.toString(A.get(0));
for(int i = 1; i < A.size(); i++){
s = myCompare(s, Integer.toString(A.get(i)));
}
return s;
}
public String myCompare(String X, String Y){
if((Integer.valueOf(X+Y) > Integer.valueOf(Y+X))){
return X+Y;
}else{
return Y+X;
}
}
}
我的代码有什么问题。因为它通过了所有测试用例,但是当我要提交它时,它显示-
您的提交因运行时错误而停止,例如:除以零、数组索引超出范围、未捕获的异常。您可以尝试使用自定义输入测试您的代码,并尝试将调试语句放入您的代码中。线程“主”java.lang.NumberFormatException 中的异常:对于输入字符串:“9999999999”在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 在 java.lang.Integer.parseInt(Integer.java:583) 在java.lang.Integer.valueOf(Integer.java:766) 在 Solution.myCompare(Solution.java:37) 在 Solution.largestNumber(Solution.java:30) 在 Main.main(Main.java:329) 你的提交失败对于以下输入 A:[ 9, 99, 999, 9999, 9998 ]
此类错误;我该如何纠正它。或者是什么问题,因为我无法弄清楚。有人可以帮忙吗?
解决方案
一些测试输入很大,这会将 X+Y 变成一个不再适合 int 的数字,从而导致 Integer.valueOf() 失败。您可以很容易地在本地发生此错误:Integer.valueOf("9999999999")
会这样做。输入甚至不是特别大。错误打印哪些输入失败。
你的myCompare
方法需要重写。您不能通过将它们转换为整数然后检查来比较 2 个字符串;输入形成太大的数字。
一个有点奇怪(当然不是这个问题的意图)的解决方法是BigInteger
改用。更可能的解决方案是编写基于字符串的数值比较算法。我很确定(X+Y).compareTo(Y+X)
会这样做 - 比较“自然顺序”,即它将如何打印在地址簿中。这种搜索的问题在于,例如“100”被认为比“99”“小”,因为“100”以“1”开头,“1”在“9”之前。同样的原因安德森先生出现在斑马先生面前。
如果你对一个包含数字的字符串进行零剥离(删除所有前导零,我认为你不需要在这里担心它,因为你有一个前提条件是所有数字都是正数,即大于零),那么这个算法将为您提供更大的数字,而无需转换为整数:
- 如果两个字符串之一较短,那就是较小的数字。
- 如果它们的长度相同,只需进行基本的字母比较:如果 a 较小,则
a.compareTo(b)
wherea
和b
are 字符串返回负数,如果 a 较大,则返回正数,如果 a 和 b 相等则返回 0。
推荐阅读
- java - KafkaIO with BootStrapServers
- reactjs - 使用 React Router 处理“找不到页面”
- typescript - 具有映射和条件类型的递归类型定义
- c - asm volatile("" ::: "memory") 的便携式等价物?
- css - MediaWiki:如果菜单是西里尔文,如何在每个菜单的侧边栏中添加图像(图标)?
- c# - SqlBulkCopy.WriteToServer 工作需要哪些 GRANTS?
- swift - Xcode 13,Swift5.5,“错误:'FilePath' 类型的值没有成员'components'”
- azure-data-factory - 如何替换包含字符串的字符串中的所有\
- android - 如何使用 Android ShareSheet 实现此行为?
- sql - 当前 2 列匹配时,根据条件选择记录