【剑指Offer】数组排成最小的数(特殊排序法)

如果要将两个数m和n排成最小的数,我们只需要通过字符串的比较(不用数字比较可以防止大数溢出),得到mn 和 nm哪个比较大,因为二者的位数是相同的。
Arrays.sort(strs,(o1,o2)->(o1+o2).compareTo(o2+o1));
自定义排序方式:当 o1+o2 > o2+o1时,o1大于o2,o1排在o2后面。
最后得到的数组就是符合要求的。
需要证明这种自定义的排序是有效的,需要证明排序的三个必要条件:满足自反性、传递性、对称性。
自反性:aa == aa
对称性:若a<b,则ab < ba。即ba > ab,可以推出b>a
传递性:证明如果ab < ba 且 bc < cb ----> ac < ca

1 class Solution { 2 public String minNumber(int[] nums) { 3 if(nums == null || nums.length == 0){ 4 return ""; 5 } 6 String[] strs = new String[nums.length]; 7 for(int i = 0; i < nums.length; i++){ 8 strs[i] = nums[i]+""; 9 } 10 Arrays.sort(strs,(o1,o2)->(o1+o2).compareTo(o2+o1)); 11 StringBuilder sb = new StringBuilder(); 12 for(String s : strs){ 13 sb.append(s); 14 } 15 return sb.toString(); 16 } 17 }
class Solution {
public String minNumber(int[] nums) {
if(nums == null || nums.length == 0){
return "";
}
String[] strs = new String[nums.length];
for(int i = 0; i < nums.length; i++){
strs[i] = nums[i]+"";
}
Arrays.sort(strs,(o1,o2)->(o1+o2).compareTo(o2+o1));
StringBuilder sb = new StringBuilder();
for(String s : strs){
sb.append(s);
}
return sb.toString();
}
}

浙公网安备 33010602011771号