题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323。
思路:
本体有两个难点:第一个难点是想出一种新的比较规则来排序一个数组;第二个难点在于证明这个比较规则是有效的,并且证明根据这个规则排序之后把数组中所有数字拼接起来得到的数字是最小的。
考察解决大数问题的能力。应聘者在面试的时候要意识到,把两个int型的整数拼接起来得到的数字可能会超出int型数字能够表达的范围,从而导致数字益处。我们可以用字符串表示数字,这样就能简洁地解决大数问题。
import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class minCmp{ public String getMin(int[] array){ if(array == null || array.length == 0) return ""; String[] str = new String[array.length]; for(int i=0;i<array.length;i++){ str[i] = String.valueOf(array[i]); } Arrays.sort(str,new Comparator<String>(){ @Override public int compare(String o1,String o2){ return (o1+o2).compareTo(o2+o1); } }); String cc = ""; for(int i=0;i<str.length;i++){ cc += str[i]; } return cc; } public static void main(String[] args){ // Scanner scanner = new Scanner(System.in); // System.out.println("请任意输入一个数组(以“,”隔开):"); // String str = scanner.nextLine(); // String[] temp = str.split(","); // scanner.close(); // int[] array = new int[temp.length]; // for(int i = 0;i < temp.length;i++) // { // array[i] = Integer.parseInt(temp[i]); // } int[] array = {3,32,321}; minCmp comparefun = new minCmp(); System.out.println("---" + comparefun.getMin(array)); } }