题目如下:
示例
题解代码:
public class LeCo {
public static void main(String[] args) {
int[] nums = {1, 10, 12, 56};
System.out.println(largestNumber(nums));
}
public static 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]);
}
//Lambda表达式,重写排序规则
Arrays.sort(strArr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
//字符数组->字符串 转化
StringBuilder sb = new StringBuilder();
for (String str : strArr) {
sb.append(str);
}
String result = sb.toString();
//特殊情况 若干个0
if (result.charAt(0) == '0') {
result = "0";
}
return result;
}
}
输出结果如下:
代码分析:
由上可见,输出结果很正确,下面来分析以下这个代码。
if语句,只是为了判断是否为空数组,如果为空数组,直接返回空字符串
if (nums == null || nums.length == 0) {
return "";
}
创建一个新的字符串类型的数组,将原int类型的数组中的数据全部转化为字符类型
String[] strArr = new String[nums.length];
for (int i = 0; i < strArr.length; i++) {
strArr[i] = String.valueOf(nums[i]);
}
注意,注意,本代码的精髓来了。 重写Arrays.sort()方法,将相邻的两个元素相加(这里是字符串类型,所以相加也就是拼凑在一起),与这两个元素反向相加作比较,如果正向相加大于反向相加,这两个元素的位置就不变,否则交换位置,直到数组中所有的元素都是按照这种规则排列的为止。为了方便理解,下面有我手写的流程。
Arrays.sort(strArr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
先实例化一个StringBuffer类,利用StringBuffer的append方法,来将数组中的字符串追加输出,再转化为String类型的字符串
StringBuilder sb = new StringBuilder();
for (String str : strArr) {
sb.append(str);
}
String result = sb.toString();
最后再判断一下特殊情况,就是字符串以0开头的情况。上面我们已经分析过了排序算法,我们知道0是不可能被排到第一位的,除非全都是0,如果是这种情况,我们就直接输出字符串0就行了
if (result.charAt(0) == '0') {
result = "0";
}
总结:
以上就是对代码的详细分析了,代码的核心就在于自定义排序算法