如何使用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());
}
}
答案 0 :(得分:3)
您使用的算法错误。您的算法因[9, 90]
而失败。 9 < 90
,但990
不是正确的解决方案。 909
应该是正确的解决方案。您需要以以下方式排列数组A
中的数字,即对于两个索引i
和j
,以使i < j
,A[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