如何使用int数组创建最小的数字。(数字可以很长,可以返回String而不是数字)

时间:2019-01-13 14:19:21

标签: java

如何使用int数组创建最小的数字。(数字可以很长,可以返回String而不是数字。)

Input -->  {10,2,39,37,30,67,7,9}
output --> 1023037396779

class A {
    public static void main(String[] args) {
        int arr[] = new int[]{10, 2, 39, 37, 30, 67, 7, 9};
        ArrayList<String> strArr = new ArrayList<String>();
        for (Integer i : arr) strArr.add(i.toString());
        System.out.println("First sysout");
        strArr.forEach(e -> System.out.print(e + " "));
        System.out.println("\nsecond sysout");
        Collections.sort(strArr);
        StringBuffer sb = new StringBuffer();
        strArr.forEach(e -> sb.append(e));
        System.out.println(sb.toString());
    }
}

2 个答案:

答案 0 :(得分:3)

您使用的算法错误。您的算法因[9, 90]而失败。 9 < 90,但990不是正确的解决方案。 909应该是正确的解决方案。您需要以以下方式排列数组A中的数字,即对于两个索引ij,以使i < jA[i] + A[j]在字典上更小比A[j] + A[i]的字符串。为此,您可以在排序时使用自定义比较器。

class LexicographicalSortingOrder implements Comparator<String>
{
    public int compare(String first, String second)
    {
        return (first + second).compareTo(second + first); 
    }
}

您可以更改行

Collections.sort(strArr)

Collections.sort(strArr, new LexicographicalSortingOrder())

您也可以使用lambda代替它来缩短此时间

Collections.sort(strArr, (first, second) -> (first + second).compareTo(second + first))

答案 1 :(得分:0)

代码应为:

public String minNumber(int[] numbers) {
    // convert int[] -> List<String>
    List<String> list = new ArrayList<>(numbers.length);
    for (int num : numbers) {
        list.add(String.valueOf(num));
    }

    // sort using custom comparator
    Collections.sort(list, (o1, o2) -> (o1 + o2).compareTo(o2 + o1));

    // join sorted items, forming max possible number
    return String.join("", list);
}

或Java8:

public String minNumber(int... numbers) {
    return Stream.of(numbers)
            .boxed()
            .filter(n -> n >= 0)
            .map(Object::toString)
            .sorted((s1, s2) -> (s1 + s2).compareTo(s2 + s1))
            .collect(Collectors.joining());
}

您需要处理类似"9"&"90"这样的特殊情况,因为我们需要"909"而不是"990"。 在这种情况下,Collections.sort()将失败。因此,我们需要一个自定义的Comparator,我们可以在其中使用(str1+str2).compareTo(str2+str1)

此处的关键是确保这两个字符串至少具有一些不同的数字,因此我们不能通过比较那里的长度来获得顺序。


参考类似的问题:

How to find the largest possible number given an array of non-negative numbers in Java