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 }