首页 > 解决方案 > 找到最大的数。描述 - 给定一个非负整数列表,将它们排列成最大的数

问题描述

例如。给定 [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 ]

此类错误;我该如何纠正它。或者是什么问题,因为我无法弄清楚。有人可以帮忙吗?

标签: javaarraysstringlistcollections

解决方案


一些测试输入很大,这会将 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)whereabare 字符串返回负数,如果 a 较大,则返回正数,如果 a 和 b 相等则返回 0。

推荐阅读