179. 最大数

给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。

示例 1:

输入: [10,2]

输出: 210

示例 2:

输入: [3,30,34,5,9]

输出: 9534330

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/largest-number 著作权归领扣网络所有。

 1     //自定义一个comparator 方法,用于sort排序的比较
 2     private class LargerNumberComparator implements Comparator<String> {
 3         @Override
 4         public int compare(String a, String b) {
 5             String order1 = a + b;
 6             String order2 = b + a;
 7             //这个compareTo方法是返回int型数的,比较字符串的每一个字符,
 8             //如果其中一个比较完都相等,则返回长字符串1的长度-字符串2的长度;
 9             //如果中间比较其中一个字符不一样,返回这两个字符的ASCII码的差值,可正可负。
10            return order2.compareTo(order1);
11         }
12     }
13 
14     public String largestNumber(int[] nums) {
15         // Get input integers as strings.
16         String[] asStrs = new String[nums.length];
17         //创建字符串数组用于存数组的每一个数转为字符串
18         for (int i = 0; i < nums.length; i++) {
19             asStrs[i] = String.valueOf(nums[i]);
20         }
21 
22         // Sort strings according to custom comparator.
23         //排序用到自定义的比较器
24         Arrays.sort(asStrs, new LargerNumberComparator());
25 
26         // If, after being sorted, the largest number is `0`, the entire number
27         // is zero.
28         if (asStrs[0].equals("0")) {
29             return "0";
30         }
31 
32         // Build largest number from sorted array.
33         String largestNumberStr = new String();
34         //拼接输出字符串
35         for (String numAsStr : asStrs) {
36             largestNumberStr += numAsStr;
37         }
38 
39         return largestNumberStr;
40     }

 

方法二:用类似快排的方式,分区再分区。。

 1     public String largestNumber(int[] nums) {
 2         quickSort(nums,0,nums.length -1);
 3         if(nums[0] ==0) return "0";
 4         String res = new String("");
 5         for(int num : nums){
 6             res +=num;
 7         }
 8         return res;
 9     }
10     public void quickSort(int[] nums,int start,int end){
11         int mid = nums[(start+end)/2];
12         int i = start;
13         int j = end;
14         while(i<j){
15             while(i<j && myCompareTo(nums[j], mid)<0){
16                 j--;
17             }
18             while(i<j && myCompareTo(nums[i], mid)>0){
19                 i++;
20             }
21             if(i<j && myCompareTo(nums[i], nums[j])==0){
22                 i++;
23             }else{
24                 int tmp = nums[i];
25                 nums[i] = nums[j];
26                 nums[j] = tmp;
27             }   
28         }
29         if(i-1 > start){
30             quickSort(nums, start,i-1);
31         }
32         if(j+1 < end){
33             quickSort(nums, j+1, end);
34         }
35     }
36     public int myCompareTo(int a ,int b){
37         return (a+""+b).compareTo(b+""+a);
38     }

 

posted on 2019-08-13 21:24  大猫食小鱼  阅读(254)  评论(0编辑  收藏  举报