题干:
输入一个个数较大的正整数数组[数字范围在0~9999],将部分数组元素的十进制表示连接起来排成一个数,输出能排出的所有数字中最大的一个。
解题思路:
现将数组按照从大到小排序,去前n个元素,转成string数组存储,再将string数组排序,排序规则为:两个string相互比较,迭代次数为两个string的长度相加减一,每次比较第n位的char字符,如果索引越界则取对方的char字符,索引为当前迭代次数减去己方string的长度,比较两个char字符的大小,大的字符放在前面,直至迭代完成。
实现
private static String largestNumber(int []array, int numbers){
sortNumber(array , 0 , array.length -1 );
String[] strs = new String[numbers];
for (int i = 0; i < numbers; i++) {
strs[i] = String.valueOf( array[i]);
System.out.println(strs[i]);
}
sortString(strs , 0 , strs.length - 1);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < strs.length; i++) {
sb.append(strs[i]);
}
return sb.toString();
}
public static void sortNumber(int[] array,int lo ,int hi ){
if(lo>=hi){
return ;
}
int index= partitionNumber(array,lo,hi);
sortNumber(array,lo,index-1);
sortNumber(array,index+1,hi);
}
public static int partitionNumber(int []array, int lo, int hi ){
int key=array[lo];
while(lo<hi){
while(array[hi]<=key&&hi>lo){
hi--;
}
array[lo]=array[hi];
while(array[lo]>=key&&hi>lo){
lo++;
}
array[hi]=array[lo];
}
array[hi]=key;
return hi;
}
public static void sortString(String[] array ,int lo , int hi ){
if(lo>=hi){
return ;
}
int index= partitionString(array,lo,hi);
sortString(array,lo,index-1);
sortString(array,index+1,hi);
}
public static int partitionString(String []array, int lo, int hi ){
String key=array[lo];
while(lo<hi){
while( CompareString(array[hi] , key) &&hi>lo){
hi--;
}
array[lo]=array[hi];
while(!CompareString(array[lo] , key)&&hi>lo){
lo++;
}
array[hi]=array[lo];
}
array[hi]=key;
return hi;
}
public static boolean CompareString(String l , String r){
int i = 0 ;
int lLength = l.length();
int rLength = r.length();
int maxLength = l.length() + r.length() - 1 ;
while (i< maxLength ){
char c1 = i < lLength ? l.charAt(i) : r.charAt(i - l.length());
char c2 = i < rLength ? r.charAt(i) : l.charAt(i - r.length());
if(c1 != c2){
return c1 < c2;
}else{
i++;
}
}
return true ;
}