package cn;
/*
最大数
给定一个非负整数的列表,重新排列它们的顺序把
他们组成一个最大的整数。
例如,给定[3,30,34,5,9],最大的组成数是
9534330.
注意: 结果可能非常大,所以您需要返回一个字符串
而不是整数。
* */
/*
思路:先对其进行"降序排序" 排序的规则如下
1、先把两个数的长度变成一样的,不够长度则用最后一位补齐
1.1 如 9 和30 比较,则 变为 99和30进行比较
2、如30 305 进行比较,则变成 300 和305 进行比较
具体排序算法比较参考:CmpNum(String str1,String str2)方法
得到结果如下:[9,5,34,3,30]
* */
public class MaxNum {
public static void main(String[] args) {
//整型数组
int[] list = {3,34,30,5,9};
System.out.println(getMaxList(list));
}
//获得 最大数的列表
public static String getMaxList(int[] list) {
//把所有整型都放在字符串数组里面
String[] str_list = new String[list.length];
//做合并的字符串
String mergeStr = "";
//把整数全部转化为字符串
for (int i = 0; i < list.length; i++) {
str_list[i] = Integer.toString(list[i]);
}
//选择排序的一种改进,采用一种"降序"排序
for (int i = 0; i < str_list.length; i++) {
for (int j = i+1; j < str_list.length; j++) {
//用一种特殊的方式进行比较, "大"的放在str[0] "小"的放在str[1]
String[] str = CmpNum(str_list[i],str_list[j]);
str_list[i] = str[0];
str_list[j] = str[1];
}
}
//把数字全部合并成字符串
for (int i = 0; i < str_list.length; i++) {
mergeStr += str_list[i];
}
return mergeStr;
}
public static String[] CmpNum(String str1,String str2) {
//返回字符串长度比较小的那个
//int minLength = str1.length()<str2.length()?str1.length():str2.length();
String[] tempStr = new String[2];
tempStr[0] = str1;
tempStr[1] = str2;
int str1Len = str1.length();
int str2Len = str2.length();
//先进行一下备份
String cpyStr1 = str1;
String cpyStr2 = str2;
if(str1Len < str2Len) {
//获得最后的元素
String tail = str1.substring(str1Len-1);
String mergTail = "";
//把结尾给补齐
for (int i = 0; i < str2Len-str1Len; i++) {
mergTail += tail;
}
cpyStr1 = cpyStr1+mergTail;
}else if(str1Len >str2Len) {
//获得最后一个元素
String tail = str2.substring(str2Len-1);
String mergTail = "";
//把结尾给补齐
for (int i = 0; i < str1Len-str2Len; i++) {
mergTail += tail;
}
cpyStr2 = cpyStr2+mergTail;
}
//转换为整数
int num1 = Integer.parseInt(cpyStr1);
int num2 = Integer.parseInt(cpyStr2);
if(num1<num2) {
//如何小的话,就交换
tempStr[0] = str2;
tempStr[1] = str1;
}//如果大的话就不交换
return tempStr;
}
}
2018-4-26 By:越林