给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:“210”
示例 2:
输入:nums = [3,30,34,5,9]
输出:“9534330”
示例 3:
输入:nums = [999999998,999999997,999999999]
输出:“999999999999999998999999997”
示例 4:
输入:nums = [1,2,3,4,5,6,7,8,9,0]
输出:“9876543210”
示例 5:
输入:nums = [0,0]
输出:“0”
思路:
正常来讲,可以使用dfs,类似abc排序[abc,acb,bac,bca,cab,cba],然后去排序后的数值最大值。
但是一看到示例4,立马放弃dfs排列,因为大概率会超时
实现方式:java的sort排序Comparator接口
list:[1,10,2,6,4]
数字排序:list.stream().sorted((o1, o2) -> o2 - o1)
list:[“1”,“10”,“2”,“6”,“4”]
list.stream().sorted((o1, o2) -> o2.compareTo(o1))
本题是将list中字符串数字,排序组成大的数[“321”,“3”],我们期望的是3321 > 3213
所以,这里不能单单的是(o1, o2) -> o2.compareTo(o1),因为这种排序,肯定把321这个大的排在3这个小的前形成3213。此时需要:
(o1, o2) -> (o2 + o1).compareTo(o1 + o2)
这种排序,会判断3213 和 3321的大小,显然3321 > 3213,会把3放在前面,321放在后面
code
class Permutation123LargerNum{
public String largestNumber(int[] arr) {
if (arr == null || arr.length == 0) {
return "";
}
if (arr.length == 1) {
return String.valueOf(arr[0]);
}
String s = Arrays.stream(Arrays.stream(arr).boxed().toArray()).map(String::valueOf)
.sorted((o1, o2) -> (o2 + o1).compareTo(o1 + o2)).collect(Collectors.joining());
// 这里主要是针对示例5,s = "00"的场景
return s.charAt(0) == '0' ? "0" : s;
}
}
本文介绍了一种算法,用于将一组非负整数重新排列,形成一个可能非常大的最大整数。通过示例展示了如何使用Java的sort排序Comparator接口实现这一目标,包括处理特殊场景如全零输入。
241

被折叠的 条评论
为什么被折叠?



