java实现给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数
示例1
:
输入:[9, 99, 9, 53, 564, 34, 5, 94, 56]
输出:9999945656455334
示例2
:
输入:[30,30304,304,303]
输出:3043033030430
示例3
:
输入:[0,0,0]
输出:0
思路分析:
1.多个数组成最大数,可以看成一种特殊的冒泡排序,通过比较把大数依次左移
2.可通过两个数分别左右拼接:比如拿[34,346]
做例子,我们只用比较34346
,34634
两者大小,明显后者大,做交换,数组中从从大到小的数据依此是[346,34]
简单的分析之后,贴出代码
public static boolean curNumBiggerThanLoopNum(long curNum, long loopNum) {
boolean result = true;
String curNumStr=String.valueOf(curNum);
String loopNumStr=String.valueOf(loopNum);
String curNumFirst = curNumStr + loopNumStr;
String loopNumFirst = loopNumStr + curNumStr;
int res = curNumBigger(curNumFirst, loopNumFirst);
if (res < 0) {
result = false;
} else if (res == 0) {
if (curNumStr.length() > loopNumStr.length()){
result = false;
}
}
return result;
}
/**
* 字符串型的数比较
* @param curNum
* @param loopNum
* @return 当前数curNum大(返回1),等(返回0),小(返回-1)
*/
public static int curNumBigger(String curNum, String loopNum) {
for (int i = 0; i < curNum.length(); i++) {
int curChar = curNum.charAt(i);
int loopChar = loopNum.charAt(i);
if (loopChar > curChar) {
return -1;
}
if (loopChar < curChar) {
return 1;
}
}
return 0;
}
public static String largestNumber(int[] nums) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
int curNum = nums[i];
int loopNum = nums[j];
//下一个数比当前数大则交换位置
if (!curNumBiggerThanLoopNum(curNum, loopNum)) {
int temp = curNum;
nums[j] = temp;
nums[i] = loopNum;
}
}
}
for (int i = 0; i < nums.length; i++) {
sb.append(nums[i]);
}
String string = sb.toString();
while (string.startsWith("0") && string.length() > 1) {
string = string.replaceFirst("0", "");
}
return string;
}
测试:
public static void main(String[] args) {
int[] nums1 = {9, 99, 9, 53, 564, 34, 5, 94, 56};
int[] nums2 = {30, 30304, 304, 303};
int[] nums3 = {0,0};
System.out.println(largestNumber(nums1));
System.out.println(largestNumber(nums2));
System.out.println(largestNumber(nums3));
}
输出:
9999945656455334
3043033030430
0