179.最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:

1
2
输入:nums = [10,2]
输出:"210"

示例 2:

1
2
输入:nums = [3,30,34,5,9]
输出:"9534330"

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 109

更改sort的比较规则

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
// 定义一个方法 largestNumber,接受一个整数数组 nums 作为参数,返回一个表示最大数字的字符串。
public String largestNumber(int[] nums) {
int n = nums.length;
// 创建一个字符串数组,用于存放整数数组中的每个元素的字符串形式。
String[] ss = new String[n];
// 将整数数组中的每个数字转换为字符串,并存入字符串数组 ss。
for (int i = 0; i < n; i++) ss[i] = "" + nums[i];
// 对字符串数组进行排序。自定义排序规则:比较两个字符串 a 和 b 拼接的两种组合 ab 和 ba。
Arrays.sort(ss, (a, b) -> {
// 拼接字符串 a 和 b 以及 b 和 a。
String sa = a + b, sb = b + a;
// 比较两种拼接方式,按照降序排序以确保较大的组合优先。
return sb.compareTo(sa);
});

// 使用 StringBuilder 来构建最终的结果字符串。
StringBuilder sb = new StringBuilder();
// 遍历排序后的字符串数组,将其元素添加到 StringBuilder 中。
for (String s : ss) sb.append(s);
// 获取 StringBuilder 的长度。
int len = sb.length();
// 用于找到字符串中第一个非 '0' 字符的索引。
int k = 0;
// 如果字符串由前导 '0' 组成,找到第一个非 '0' 的位置。
while (k < len - 1 && sb.charAt(k) == '0') k++;
// 从第一个非 '0' 字符开始截取字符串,以去除前导 '0'。
return sb.substring(k);
}
}