题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

思路:找到数组中数的排列顺序,任意一个子序列都满足S1+S2<S2+S1的规律,因为若某两个数不满足,那么调换两个数的顺序,生成的新的数字必然比之前的数要更小。

public class Q_32 {

public String PrintMinNumber(int[] numbers) {
    ArrayList<Integer> list = new ArrayList<>();
    for (int i = 0; i < numbers.length; i++) {
        list.add(numbers[i]);
    }

    Collections.sort(list, (a, b) -> {
        return (a + "" + b).compareTo(b + "" + a);
    });
    String result = "";
    for (int s : list) {
        result += s;
    }
    return result;
}

public static void main(String[] args) {
    int[] arr = {3, 32, 321};
    System.out.println(new Q_32().PrintMinNumber(arr));
}

}