publicclass Q33把数组排成最小的数 {
/**
* 题目:把数组排成最小的数
* 题目说明:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数字{3,32,321},则打印出这3个数字能排成的最小数字321323
* 解题思路:先比较两个数的组合情况,以及大小的比较情况。例如输入m和n,其组合情况为mn,nm
* 1)如果mn <nm——>输出mn ——> m < n;
* 2)如果nm <mn——>输出nm ——> n < m;
* 3)如果mn =nm ——>输出任意一个 ——> m = n;
* 注意:输入的m和n是正数,则它们的组合情况可能越界,因此要将其组合形式转换成字符串,然后比较组合字符串的大小,将小的字符串组合输出。
*/
publicstatic void main(String[] args){
Q33把数组排成最小的数 test = new Q33把数组排成最小的数();
int[] array = {3,32,321};
test.printMinNum(array);
}
publicvoid printMinNum(int[] array){
int[] clone = array.clone();
printMinNumber(clone, 0, clone.length-1);
for(int i : clone)
System.out.print(i);
}
privatevoid printMinNumber(int[] array,int start, int end) {//start和 end 是下标
if(start < end){//起始点小于终止点时为空
int number = array[end];//number中存放的是数组元素
int small = start;//small表示下标,存放较小的数字
for(int j = start; j < end; j++){
//比较数组中两个元素的大小,判断String.valueOf(array[j])是否小于 String.valueOf(number)
if(isSmall(String.valueOf(array[j]),String.valueOf(number))){//如果小于成立,则将较小的数存放到array[small]中
int temp = array[j];
array[j] = array[small];
array[small] = temp;//较小的数存放到array[small]中
small ++;
}
}
array[end] = array[small];
array[small] = number;
printMinNumber(array, 0, small-1);//注意防止越界异常哦(-1)
printMinNumber(array, small + 1, end);
}
}
//比较两个字符串数字的大小
privateboolean isSmall(String m, String n){//结果为false时,满足的是nm < mn(n < m);结果为true时,满足的是mn < nm (m < n)
boolean result =false;
String leftString =m+n;
String rightString =n+m;
for(int i = 0; i < leftString.length(); i++){
if(leftString.charAt(i) <rightString.charAt(i)){//mn <nm
returntrue;
}else {
if(leftString.charAt(i) >rightString.charAt(i))//nm <mn
returnfalse;
}
}
return result;
}
}
Q33:把数组排成最小的数
最新推荐文章于 2020-02-01 19:45:51 发布