【剑指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();
    }
}
posted @ 2020-06-11 16:11  xd会飞的猫  阅读(261)  评论(0)    收藏  举报