题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
分类:数组,字符串
解法1:将数组重新排序,然后拼接就可以了,排序的方式可以使用快速排序
比较的原则是321<3
341>3等
分类:数组,字符串
解法1:将数组重新排序,然后拼接就可以了,排序的方式可以使用快速排序
比较的原则是321<3
341>3等
import java.util.ArrayList;
public class Solution {
public String PrintMinNumber(int [] numbers) {
solve(numbers, 0, numbers.length-1);
StringBuilder sb = new StringBuilder(numbers.length);
for(int i=0;i<numbers.length;i++){
sb.append(numbers[i]);
}
return sb.toString();
}
public void solve(int [] numbers,int low,int high){
if(low<high){
int mid = partition(numbers,low,high);
solve(numbers, low, mid-1);
solve(numbers, mid+1, high);
}
}
public boolean compare(int x,int y){
int count1 = 0;
int x1 = x;
while(x1!=0){
count1++;
x1/=10;
}
int[] arr1 = new int[count1];
create(x,arr1);
int count2 = 0;
int x2 = y;
while(x2!=0){
count2++;
x2/=10;
}
int[] arr2 = new int[count2];
create(y,arr2);
int i=0;
while(i<count1&&i<count2){
if(arr1[i]<arr2[i]) return true;
else if(arr1[i]>arr2[i]) return false;
i++;
}
if(i==count1){
int t = arr1[count1-1];
while(i<count2&&t==arr2[i]){
i++;
}
if(i==count2 || t<arr2[i]){
return true;
}else{
return false;
}
}
if(i==count2){
int t = arr2[count2-1];
while(i<count1&&t==arr1[i]){
i++;
}
if(i==count1 || t<arr1[i]){
return false;
}else{
return true;
}
}
return false;
}
public void create(int x,int[] arr){
int i = arr.length-1;
while(x!=0){
arr[i] = x%10;
x/=10;
i--;
}
}
public int partition(int [] array,int low,int high){
int temp = array[low];
while(low<high){
while(low<high && compare(temp,array[high])){
high--;
}
array[low] = array[high];
while(low<high && compare(array[low],temp)){
low++;
}
array[high] = array[low];
}
array[low] = temp;
return low;
}
}