问题描述:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
1 /*
2 *比较两个数字拼接字符串时,谁排在前的call back 函数
3 *
4 *比较条件为将两个整数转换成字符串后,从最高位开始比,如果小的排在前面
5 *如果比较到末尾结束两个字符串都相同,则将短的那个字符串的第一个字符和长的字符串剩下的字符比较,比较结果小的排在前面
6 *
7 */
8 public Comparator<Integer>NumberCompare()
9 {
10 return new Comparator<Integer>() {
11 @Override
12 public int compare(Integer number1, Integer number2) {
13 // TODO Auto-generated method stub
14 /*
15 char str1[] = number1.toString().toCharArray();
16 char str2[] = number2.toString().toCharArray();
17
18 int len = str1.length > str2.length ? str2.length : str1.length; //获得长度小的,作为循环判断终止条件
19
20 int index;
21 for(index = 0; index < len; index++)
22 {
23 if(str1[index] > str2[index])
24 {
25 return 1;
26 }
27 else if(str1[index] < str2[index])
28 {
29 return -1;
30 }
31 }
32
33
34 if(len == str1.length)
35 {
36 for(int i = index; i < str2.length; i++)
37 {
38 if(str1[0] < str2[i])
39 {
40 return -1;
41 }
42 else if(str1[0] > str2[i])
43 {
44 return 1;
45 }
46 }
47 }
48 else
49 {
50 for(int i = index; i < str1.length; i++)
51 {
52 if(str1[i] < str2[0])
53 {
54 return -1;
55 }
56 else if(str1[i] > str2[0])
57 {
58 return 1;
59 }
60 }
61 }
62 //System.out.println(number1 + " ==== " + number2);
63 return 0;
64 */
65
66 /*
67 * 代码优化
68 * 巧妙的比较方式
69 */
70 String str1 = number1.toString();
71 String str2 = number2.toString();
72
73 str1 = str1 + str2;
74 str2 = str2 + str1;
75
76
77 return str1.compareTo(str2);
78
79
80 }
81 };
82 }
83
84
85 public String PrintMinNumber(int [] numbers)
86 {
87 String string = new String();
88
89 if(numbers == null || numbers.length == 0)
90 {
91 return string;
92 }
93
94 Comparator<Integer> comparator = NumberCompare();
95 Integer IntNumbers[] = new Integer[numbers.length];
96
97 for(int i = 0; i < numbers.length; i++)
98 {
99 IntNumbers[i] = numbers[i];
100 }
101
102 Arrays.sort(IntNumbers, comparator);
103
104
105
106 for(int i = 0; i < IntNumbers.length; i++)
107 {
108 string += IntNumbers[i].toString();
109 }
110
111 return string;
112 }