题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解题思路
不得不说,看了这题的解法,真的佩服!~
先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。
为什么需要定制排序,因为字符串 a和b 长度不等的情况。比如 “2” 和 “21” ,显然字符串”2”<”21”,但是把他们链接起来的时候 221>212.所以定制一种规则来排除这种情况。
定制排序规则如下: 若ab > ba 则 a > b, 若ab < ba 则 a < b,若ab = ba 则 a = b;
这个定制排序很妙!
代码实现
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 40 41 42 43
|
public class MinNumberArray {
public String PrintMinNumber(int[] numbers) { if (numbers == null || numbers.length == 0) { return ""; } int length = numbers.length; String[] strings = new String[length]; for (int i = 0; i < strings.length; i++) { strings[i] = String.valueOf(numbers[i]); } Arrays.sort(strings, new Comparator<String>() { @Override public int compare(String o1, String o2) { String s1 = o1 + o2; String s2 = o2 + o1; return s1.compareTo(s2); } }); StringBuilder builder = new StringBuilder(); for (int i = 0; i < strings.length; i++) { builder.append(strings[i]); }
return builder.toString(); } }
|