题目
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
分析
将数字转换为字符串形式,然后对字符串数组进行字符串的排序(本题中用的是快排),最后按照顺序连接起来即为输出。
注意,在比较两个字符串时,前提是两个字符串的长度相等,所以在比较str1和str2时,我们比较的是str1+str2和str2+str1。
代码
1 public boolean compare(String str1, String str2){ 2 String s1 = str1+str2, s2 = str2+str1; 3 if(s1.compareTo(s2)>0){ 4 return true; 5 } 6 else{ 7 return false; 8 } 9 } 10 11 public void sort(String[] s, int low, int high){ 12 if(low>high) 13 return; 14 int i = low, j = high; 15 String index = s[low]; 16 while(i<j){ 17 while(i<j && compare(s[j], index)) 18 j--; 19 if(i<j) 20 s[i++] = s[j]; 21 while(i<j && compare(index, s[i])) 22 i++; 23 if(i<j) 24 s[j--] = s[i]; 25 } 26 s[i] = index; 27 sort(s, low, i-1); 28 sort(s, i+1, high); 29 } 30 31 public String PrintMinNumber(int[] numbers){ 32 String[] s = new String[numbers.length]; 33 for(int i=0;i<numbers.length;i++){ 34 s[i] = numbers[i]+""; 35 } 36 sort(s, 0, s.length-1); 37 String res = ""; 38 for(int i=0;i<s.length;i++){ 39 res += s[i]; 40 } 41 return res; 42 }