179. 最大数
给定一组非负整数 nums
,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:“210”
示例 2:
输入:nums = [3,30,34,5,9]
输出:“9534330”
示例 3:
输入:nums = [1]
输出:“1”
示例 4:
输入:nums = [10]
输出:“10”
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 10^9
方法一:排序
解题思路
本题的本质是排序,我们希望 “影响越大” 的数字排在越前面,所以难点在于如何编写比较器(Comparator
)。
这里有一个小技巧:假设只有两个数字,如何确定哪个数字在前面?
- 设
a = 203; b = 2
,有a + b = 2032;b + a = 2203
,显然(b + a) > (a + b)
,此时应该把 b 放在前面。 - 这样比较器的写法就出来啦 -> 把数字转成字符相加比较大小即可。
- 最后,把排序完成后的数组拼接成字符串返回。
参考代码
public String largestNumber(int[] nums) {
int n = nums.length;
String[] strs = new String[n];
for (int i = 0; i < n; i++) {
strs[i] = Integer.toString(nums[i]);
}
Arrays.sort(strs, (a, b) -> (b + a).compareTo((a + b)));
// 卡测试用例,有一个全是 0.
if (Objects.equals("0", strs[0])) {
return "0";
}
StringBuilder ret = new StringBuilder();
for (String val : strs) {
ret.append(val);
}
return ret.toString();
}