给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。
示例 1:
输入: [10,2]
输出: 210
示例 2:
输入: [3,30,34,5,9]
输出: 9534330
说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
排序的核心思路: 将要排序得两个数a,b互相拼接组成ab,ba,而后比较大小
class Solution {
//归并排序
public String largestNumber(int[] nums) {
guibing(nums,0,nums.length-1);
if(nums[0]==0){
return "0";
}
StringBuilder str = new StringBuilder();
for(int i=0;i<nums.length;i++){
str.append(nums[i]+"");
}
return str.toString();
}
public void guibing(int[] nums,int left,int right){
if(left<right){
int mid = left+(right-left)/2;
guibing(nums,left,mid);
guibing(nums,mid+1,right);
//合并两个有序数组
int[] arr = new int[right-left+1];
int rmid = mid+1;
int lleft = left;
int index=0;
while(lleft<=mid && rmid<=right){
//lleft>rmid
if(check(nums[lleft],nums[rmid])){
arr[index] = nums[lleft];
lleft++;
}else{
//lleft<=rmid
arr[index] = nums[rmid];
rmid++;
}
index++;
}
while(lleft<=mid){
arr[index] = nums[lleft];
lleft++;
index++;
}
while(rmid<=right){
arr[index] = nums[rmid];
rmid++;
index++;
}
index=0;
for(int i=left;i<=right;i++,index++){
nums[i]=arr[index];
}
}
}
//按位比较,如果是最后一位就取最后一位
private boolean check(int a,int b){
if(a==b){
return true;
}
List<Integer> listA = new ArrayList<Integer>();
List<Integer> listB = new ArrayList<Integer>();
while(a!=0){
int aa = a/10;
listA.add(a%10);
a = aa;
}
if(listA.size()==0){
listA.add(0);
}
while(b!=0){
int bb = b/10;
listB.add(b%10);
b = bb;
}
if(listB.size()==0){
listB.add(0);
}
//正向 反向拼接比较大小
//listA=listA+listB
//listB=listB+listA
int i=listA.size()-1,j=listB.size()-1;
for(int k=0;k<listB.size();k++){
listA.add(listB.get(k));
}
for(int k=0;k<=i;k++){
listB.add(listA.get(k));
}
i=listA.size()-1;
j=listB.size()-1;
while(i>=0&&j>=0){
if(listA.get(i)>listB.get(j)){
return false;
}else if(listA.get(i)<listB.get(j)){
return true;
}else{
i--;
j--;
}
}
return true;
}
}