在处理整数数组组合最大数值的问题时,直接使用数值排序后拼接的方式很容易出现错误,比如数字3和30,数值上3大于30,但拼接后330比303大,这说明我们需要自定义比较规则,而基于字符串拼接比较的排序方法可以解决这个核心问题。

核心思路说明
整个方法的核心逻辑可以分为两步:
- 将整数数组中的每个元素都转换为字符串类型,避免数值大小比较的局限性
- 自定义字符串的比较规则:对于两个字符串s1和s2,比较s1+s2和s2+s1的大小,如果s1+s2更大,说明s1应该排在s2前面,反之则s2排在前面
- 按照自定义规则排序所有字符串后,按顺序拼接起来就是最大的组合数
特殊情况处理
需要注意一种特殊情况:如果数组中所有元素都是0,那么最终拼接的结果应该是0,而不是多个0拼接的字符串,需要在最后做额外的判断处理。
完整JAVA实现代码
下面是完整的实现代码,包含排序逻辑和特殊情况处理:
import java.util.Arrays;
import java.util.Comparator;
public class MaxCombineNumber {
public static String largestNumber(int[] nums) {
// 将整数数组转为字符串数组
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
strs[i] = String.valueOf(nums[i]);
}
// 自定义排序规则,比较拼接后的字符串大小
Arrays.sort(strs, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
String combine1 = s1 + s2;
String combine2 = s2 + s1;
// 降序排序,所以返回combine2.compareTo(combine1)
return combine2.compareTo(combine1);
}
});
// 处理全0的特殊情况
if (strs[0].equals("0")) {
return "0";
}
// 拼接所有字符串得到结果
StringBuilder sb = new StringBuilder();
for (String str : strs) {
sb.append(str);
}
return sb.toString();
}
public static void main(String[] args) {
// 测试用例1:普通数组
int[] nums1 = {3, 30, 34, 5, 9};
System.out.println("数组{3,30,34,5,9}的最大组合数为:" + largestNumber(nums1));
// 测试用例2:全0数组
int[] nums2 = {0, 0};
System.out.println("数组{0,0}的最大组合数为:" + largestNumber(nums2));
// 测试用例3:包含单个大数字的数组
int[] nums3 = {121, 12};
System.out.println("数组{121,12}的最大组合数为:" + largestNumber(nums3));
}
}代码逻辑解析
代码中的Comparator自定义比较规则是关键部分,通过重写compare方法,比较两个字符串不同拼接顺序的结果,确保排序后拼接能得到最大数值。比如对于字符串"3"和"30",拼接后"330"大于"303",所以"3"会排在"30"前面,符合我们的需求。
最后的全0判断是为了避免数组全为0时返回"00"这类错误结果,直接返回"0"即可。
方法验证
运行上述代码的main方法,输出结果如下:
- 数组{3,30,34,5,9}的最大组合数为:9534330
- 数组{0,0}的最大组合数为:0
- 数组{121,12}的最大组合数为:12121
可以看到结果都符合预期,说明这种基于字符串拼接比较的排序方法是正确的,能够适用于各种整数数组的场景。