输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
这个题应该再LeetCode中出现过。
也就是使用排序的方式将整个数组排序,而比较策略如下:
设s1 = “3”,s2=”32”,则
当Integer.valueOf(s1+s2)>Integer.valueOf(s2+s1),return 1;
当Integer.valueOf(s1+s2)<Integer.valueOf(s2+s1),return -1;
当Integer.valueOf(s1+s2)=Integer.valueOf(s2+s1),return 0;
使用Arrays的
public static <T> void sort(T[] a,
Comparator<? super T> c)函数进行排序
Arrays.sort底层使用的是归并排序,也可以自己设计排序算法
需要注意的是这个函数针对的是对象数组,而不是基本类型数组,所以需要转一下型。
其次是实现Comparator接口
public class Solution {
public String PrintMinNumber(int [] numbers) {
String[] n = new String[numbers.length];
int j = 0;
for(int i : numbers){
n[j++] = String.valueOf(i);
}
Arrays.sort(n,new myComparator());
StringBuilder sb = new StringBuilder();
for(int i = 0; i < numbers.length ; i ++){
sb.append(n[i]);
}
return sb.toString();
}
private static class myComparator implements Comparator<String>{
@Override
public int compare(String s1 , String s2){
int i1 = Integer.valueOf(s1+s2);
int i2 = Integer.valueOf(s2+s1);
System.out.println(i1+"----"+i2);
if(i1 > i2){
return 1;
}else if(i1 < i2){
return -1;
}else{
return 0;
}
}
}
}
使用内部匿名类
import java.util.*;
public class Solution {
public String PrintMinNumber(int [] numbers) {
String[] n = new String[numbers.length];
int j = 0;
for(int i : numbers){
n[j++] = String.valueOf(i);
}
//瞬间有点高大上了,
Arrays.sort(n,new Comparator<String>(){
@Override
public int compare(String s1 , String s2){
int i1 = Integer.valueOf(s1+s2);
int i2 = Integer.valueOf(s2+s1);
System.out.println(i1+"----"+i2);
if(i1 > i2){
return 1;
}else if(i1 < i2){
return -1;
}else{
return 0;
}
}
});
StringBuilder sb = new StringBuilder();
for(int i = 0; i < numbers.length ; i ++){
sb.append(n[i]);
}
return sb.toString();
}
}