题目分析:找到一个排序规则,将数组排序。这个规则比较两个数m和n哪个排在前面值会比较小(用字符串大小比较来比较 mn>nm)
重要推导:根据这种比较规则把数组排序后,将数组中所有数字拼接起来得到的数字是最小的(反证法)
代码:
* 问题描述:输入一个正整数数组,将数组中所有数字拼接起来排成一个数,打印拼接出的所有数中最小的一个
* 输入:{3,32,321}
* 输出:321323
* Created by lxq on 2017/9/6.
*/
public class Problem4 {
public void PrintMin(int[] array){
//为什么要拷贝一份
int[] clone = array.clone();
printMinNumber(clone,0,clone.length-1);
for(int i:clone)
System.out.println(i);
}
/*
根据新定义的比较规则来排序这个数组
/*
private void printMinNumber(int[] array, int start, int end) {
if(start<end){
int main_number = array[end]; //设置了一个标志量
int small_cur = start; //遇到小的就过去了(+1),遇到大的就停止
//二分排序
for(int j=start;j<end;j++){
if(isSmall(String.valueOf(array[j]),String.valueOf(main_number))){
int temp = array[j];
array[j] = array[small_cur];
array[small_cur] = temp;
small_cur++;
}
}
//最后将end和small_cur交换一下,左边都是比标志量小的,右边都是比它大的
array[end] = array[small_cur];
array[small_cur] = main_number;
//递归调用,两边
printMinNumber(array,0,small_cur-1);
printMinNumber(array,small_cur+1,end);
}
}
//重新定义比较两个字符串的规则
private boolean isSmall(String m, String n) {
String left = m+n;
String right = n+m;
boolean result = false;
for(int i =0;i<left.length();i++){
if(left.charAt(i)<right.charAt(i))
return true;
else if(left.charAt(i)>right.charAt(i))
return false;
}
return result;
}
}