题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解题思路
先将数组转换成字符串数组,然后对字符串数组按照规则排序,最后将排好序的字符串数组拼接出来。
排序规则:
若ab > ba 则 a > b
若ab < ba 则 a < b
若ab = ba 则 a = b
排序用到Arrays.sort():
Arrays.sort(num);
Arrays.sort(num,c);
Arrays.sort(num,0,n);
Arrays.sort(num,0,n,c);
它可以使用自定义的排序方法。
public static void sort(T[] a,Comparator<? super T> c)
从函数原型中可以看出,num数组的类型必须是基本类型(如int、char、double……)对应的类(如Integer、Character、Double……)的对象(而且数组必须在创建时就初始化)
对于实现了Comparator接口的类的对象c的写法,如果只是对基本类型对应的类对象的排序,推荐匿名内部类的写法。
自定义排序方法需要实现java.util.Comparetor接口中的compare方法。
int compare(Object obj1, Object obj2)
compare方法返回负数时代表不交换
compare方法返回0时代表不交换
compare方法返回正数时代表交换
代码中如下是关键:
Arrays.sort(str,new Comparator<String>(){
public int compare(String s1,String s2){
String c1=s1+s2;
String c2=s2+s1;
return c1.compareTo(c2);
}
代码实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
public class Solution {
public String PrintMinNumber(int [] numbers) {
int len=numbers.length;
if(len==0)
return "";
if(len==1)
return String.valueOf(numbers[0]);
StringBuffer res=new StringBuffer();
String[] str=new String[len];
for(int i=0;i<len;i++)
str[i]=String.valueOf(numbers[i]);
Arrays.sort(str,new Comparator<String>(){
public int compare(String s1,String s2){
String c1=s1+s2;
String c2=s2+s1;
return c1.compareTo(c2);
}
});
for(int i=0;i<len;i++)
res.append(str[i]);
return res.toString();
}
}