目录
题目
Given a list of non negative integers, arrange them such that they form the largest number.
Example:
Given [3, 30, 34, 5, 9], the largest formed number is 9534330.
Note:
- The result may be very large, so you need to return a string instead of an integer.
解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| public class Solution { public String largestNumber(int[] nums) { if(nums == null || nums.length == 0) return ""; String[] s_num = new String[nums.length]; for(int i = 0; i < nums.length; i++){ s_num[i] = String.valueOf(nums[i]); } Comparator<String> comp = new Comparator<String>(){ @Override public int compare(String str1, String str2){ String s1 = str1 + str2; String s2 = str2 + str1; return s2.compareTo(s1); } }; Arrays.sort(s_num, comp); if(s_num[0].charAt(0) == '0'){ return "0"; } StringBuilder sb = new StringBuilder(); for(String s: s_num){ sb.append(s); } return sb.toString(); } }
|
注意事项
1.曾考虑以下想法:
- 对于两个要比较的数,将长度补齐,并且较短的末尾是用0补齐
- 对于两个要比较的数,将长度补齐,并且较短的末尾是用个位数补齐
这两种方法都需要考虑不少特殊情况再单独做出判断,不是很完整。
2.上述方法是借鉴discuss中vote较高的回答。核心是实现Comparator接口用来定义排序规则,用此规则使用Arrays.sort排序。
3.由于最后要做字符串拼接,因此务必使用StringBuilder而非String直接相连,大大提高性能。