题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
练习地址
lc
实现
问题:转化为比较m、n大小规则制定问题,直接拼接会造成溢出,大数问题
方法:将m和n转换成字符串处理。因为mn和nm的字符串位数相同,只需要按照字符串大小的比较规则就可以。
public class C45_array_PrintMinNum {
static String printMinNum(int[] arr) {
StringBuilder res = new StringBuilder();
if (arr == null || arr.length == 0) return res.toString();
ArrayList<Integer> list = new ArrayList<>();
for (int value : arr) {
list.add(value);
}
//Comparator接口,两个对象要使用compareTo方法比较大小,就必须实现Comparator接口的compare方法,
// 比如String就实现了这个方法,所以可以直接使用compareTo进行比较。
// sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序。
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer s1, Integer s2) {
String o1 = s1 + "" + s2;
String o2 = s2 + "" + s1;
return o1.compareTo(o2);
}
});
for (int l : list) {
res.append(l);
}
return res.toString();
}
}
Test
public static void main(String[] args) {
int[] arr = {3, 32, 321};//321323
System.out.println(printMinNum(arr));
}