把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组[3, 32, 321],则打印出这3个数字能排成的最小数字321323。
样例 输入:[3, 32, 321] 输出:321323 注意:输出数字的格式为字符串。
思路:
复杂度为O(n!),那么我们能不能不进行全排列就能找到那个特定的排列呢?很容易想到就是排序,如果能想到一个很好的排序策略,即可优雅得到最后的结果。
对于给定的2个数,a和b。如何确定两者之间的排序策略呢?我们可以发现这两者的排列为:ab,ba。我们最终目的是找到字典序最小的那个排列,所以我们肯定应该保持这种关系,从而决定是否交换顺序:
- 当ab < ba, a排在b的左边
- 当ab > ba, b排在a的左边
- 当ab = ba, 位置关系随意
public String printMinNumber(int[] nums) {
List<Integer> list = new ArrayList<>();
String s = "";
for(int x:nums){
list.add(x);
}
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
String a = o1.toString()+o2.toString();
String b = o2.toString()+o1.toString();
return a.compareTo(b);
}
});
for(int x:list){
s+=x;
}
return s;
}