把数组排成最小的数
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
方法一
最直接的一种方法就是类似于之前有道题“字符串的全排列”,先求出数组中所有数字的全排列,然后把每个排列拼起来,秋后求出拼起来的数字的最小值。但是n个数字总共有n!个排列。我没有实现这个方法。
方法二
先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。
排序规则如下:
- 若ab > ba 则 a > b,
- 若ab < ba 则 a < b,
- 若ab = ba 则 a = b;
解释说明:
- 比如 “3” < "31"但是 “331” > “313”,所以要将二者拼接起来进行比较.
public String PrintMinNumber(int [] numbers) {
if(numbers == null || numbers.length <= 0) {
return "";
}
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < numbers.length; i++) {
list.add(numbers[i]);
}
Collections.sort(list, new Comparator<Integer>() {
public int compare(Integer str1, Integer str2) {
String s1 = str1 + "" + str2;
String s2 = str2 + "" + str1;
return s1.compareTo(s2);
}
});
String str = "";
for (Integer i : list) {
str += i;
}
return str;
}
注意自定义排序的时候compareTo()方法的作用:
返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方。
- 如果参数字符串等于此字符串,则返回值 0;
- 如果此字符串小于字符串参数,则返回一个小于 0 的值;
- 如果此字符串大于字符串参数,则返回一个大于 0 的值。