题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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)); }
}