题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:
暴力解法就是对所有的排列种类进行比较,这样的复杂度为n!
其实我们可以将这个大问题转化为一个个小问题,若对两个数做连接操作,所得结果大的连接顺序表明,该顺序中的第一个连接数应该排在第二个连接数之前,这样,可以对整个连接数数组做一遍快排,就能确定连接数排列顺序最优解,复杂度只要nlogn。
考虑到连接数都是int类型,若两两连接比较,int型会溢出,并且整型做连接操作很麻烦,而string型做连接操作很容易,并且不存在溢出的情况,同时string自带比较函数compareTo。
import java.lang.StringBuilder;
public class Solution {
public String PrintMinNumber(int [] numbers) {
int len=numbers.length;
String[] s=new String[len];
if(len==0)return "";
if(len==1)return String.valueOf(numbers[0]);
for(int i=0;i<len;i++){
s[i]=String.valueOf(numbers[i]);
}
qSort(s,0,len-1);
StringBuilder sb=new StringBuilder();
for(int i=0;i<len;i++){
sb.append(s[i]);
}
return sb.toString();
}
public void qSort(String[] s,int l,int r){
if(l>r)return;
String target=s[l];
int begin=l,end=r;
while(l<r){
while(l<r){
if(compare(target,s[r])>=1){
s[l++]=s[r];
break;
}
r--;
}
while(l<r){
if(compare(s[l],target)>=1){
s[r--]=s[l];
break;
}
l++;
}
}
s[l]=target;
qSort(s,begin,l-1);
qSort(s,l+1,end);
return;
}
public int compare(String s1,String s2){
String a=s1+s2;
String b=s2+s1;
return a.compareTo(b);
}
}