题目
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如
输入数组{3,32,321}
这3个数字能排成的最小数字321323.
思路
思路一
暴力算法,全排列所有的数字,选出最小的数字。时间复杂度为O(n!).
思路二
对于数字m和数字n,重新定义一种大小关系
如果mn > nm ,m 大于 n
如果nm > mn n 大于 m
如果 mn = nm n 等于 m
然后按照新定义的大小关系重新排列数组。次数得到最小的数组。
证明
证明计较两个数字大小的关系是有效的。
(1)自反性。显然有aa等于aa .
(2)对称性。 如果a 大于 b,有ba < ab。所以 b 小于 a.
(3) 传递性。从 a 大于 b,b 大于 c.证明a大于c.
证明重新排列数组后的值是有效的。
使用反证法证明。
代码
public static void printMinNumber(int[] numbers,int length){
String[] strs = new String[length];
for(int i = 0;i < length;i++){
strs[i] = String.valueOf(numbers[i]);
}
sort(strs);
for(int i = 0;i < length;i++){
System.out.print(strs[i]);
}
}
public static int compare(String str1,String str2){
String str11 = str1.concat(str2);
String str22 = str2.concat(str1);
return str11.compareTo(str22);
}
public static void sort(String[] strs){
for(int i = 0;i < strs.length - 1;i++){
String min = strs[i];
int index = i;
for(int j = i + 1;j < strs.length;j++){
if(compare(strs[j],min) < 0){
index = j;
min = strs[j];
}
}
//swap(strs[i],strs[index]);
String temp = strs[i];
strs[i] = strs[index];
strs[index] = temp;
}
}
总结
本题需要证明数字的比较关系,以及证明数组重新排列后的值最小。