题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组 {3,32,321},则打印出这三个数字能排成的最小数字为 321323。
代码如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class MinNumber {
ArrayList<String> array=new ArrayList<>();
class ComparatorListSort implements Comparator { //自定义比较器
@Override
public int compare(Object o1, Object o2) {
char[] s1=(String.valueOf(o1)).toCharArray();
char[] s2=(String.valueOf(o2)).toCharArray();
int s1_n=s1.length;
int s2_n=s2.length;
int min=s1_n-s2_n>0?s2_n:s1_n;
for(int i=0;i<min;i++)
{
if(s1[i]<s2[i])
{
return -1;
}
else if(s1[i]>s2[i])
{
return 1;
}
else
{
continue;
}
}
if(s1_n==s2_n)
{
return 0;
}
else if(s1_n<s2_n) //注意这个地方
{
return 1;
}
else
{
return -1;
}
}
}
public void getAll(int n,int left,boolean[] flag,int[] numbers, ArrayList<Integer> temp)
{
if(left==0)
{
StringBuilder sb=new StringBuilder();
for(int value:temp)
{
sb.append(value);
}
array.add(sb.toString());
return;
}
for(int i=0;i<n;i++)
{
if(flag[i]==false)
{
flag[i]=true;
temp.add(numbers[i]);
getAll(n,left-1,flag,numbers,temp);
flag[i]=false;
temp.remove(temp.size()-1);
}
}
}
@SuppressWarnings("unchecked")
public String PrintMinNumber(int [] numbers) {
int n=numbers.length;
if(n<=0)
{
return null;
}
boolean[] flag=new boolean[n];
ArrayList<Integer> temp=new ArrayList<>();
getAll(n, n,flag, numbers,temp);
Collections.sort(array,new ComparatorListSort()); //调用collections工具类,其中用到了定义比较器,使之可以按照我们规定的方式进行排序
return array.get(0);
}
public static void main(String[] args) {
System.out.println(new MinNumber().PrintMinNumber(new int[] {3,32,321,11,22}));
}
}