Given a list of non-negative integers nums, arrange them such that they form the largest number.
Note: The result may be very large, so you need to return a string instead of an integer.
给定一组非负整数
nums
,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数
Example 1:
Input: nums = [10,2]
Output: "210"
Example 2:Input: nums = [3,30,34,5,9]
Output: "9534330"
Example 3:Input: nums = [1]
Output: "1"
Example 4:Input: nums = [10]
Output: "10"
Constraints:
1 <= nums.length <= 100
0 <= nums[i] <= 109
PriorityQueue类在Java1.5中引入并作为 Java Collections Framework 的一部分。PriorityQueue是基于优先堆的一个无界队列,这个优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器)在队列实例化的时排序
我们这次还用到了comparor接口,现在看看代码
class Solution {
public String largestNumber(int[] nums) {
if(nums == null){
return "";
}
List<String> list = new ArrayList<>();
for(int num : nums){
list.add(String.valueOf(num));
}
//PriorityQueue<String> priorityQueue = new PriorityQueue<>();
//使用优先队列排序
PriorityQueue<String> priorityQueue = new PriorityQueue<>((o1, o2) -> {
String str1 = o1 + o2;
String str2 = o2 + o1;
return str2.compareTo(str1);
});
priorityQueue.addAll(list);
StringBuilder sb = new StringBuilder();
//构建结果
while (!priorityQueue.isEmpty()) {
sb.append(priorityQueue.remove());
}
if(sb.toString().charAt(0) == '0') {
return "0";
}
return sb.toString();
}
}
再提供一种方法
class Solution {
/**
* @param nums 一组非负整数
* @return - String.compareTo() 是按照 lexicographically, 字典顺序排列的
* - 利用compareTo, 来倒序排列 string, 刚好就得到我们要的结果.
*/
public String largestNumber(int[] nums) {
//合法性
if (nums == null || nums.length == 0) {
return "";
}
//数字数组->字符数组 转化
String[] strArr = new String[nums.length];
for (int i = 0; i < strArr.length; i++) {
strArr[i] = String.valueOf(nums[i]);
}
//重写排序规则 12-14ms
// Arrays.sort(strArr, new Comparator<String>() {
// @Override
// public int compare(String o1, String o2) {
// //继承此方法的时候,要自定义比较器,conpareTo方法返回值为1(升序),0,-1(降序)。
// //返回正值 交换;负值不交换
// return (o2 + o1).compareTo((o1 + o2));
// }
// });
//Lambda表达式 重写排序规则 速度慢了5倍 72-82ms
Arrays.sort(strArr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
//字符数组->字符串 转化
StringBuilder sb = new StringBuilder();
for (String aStrArr : strArr) {
sb.append(aStrArr);
}
String result = sb.toString();
//特殊情况 若干个零
if (result.charAt(0) == '0') {
result = "0";
}
return result;
}
}