剑指OfferJZ32:把数组排成最小的数-java版
JZ32:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- JZ32:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解这道题一开始我们可能会这样做:将数组中的所有数字比较一下大小,按从小到大的顺序将数组中的数字拼接,会不会就是最小的 对比上面例子,数组{3,32,321} 拼接出来就是332321,显然并不是拼接后的最小的数字 由于数组中的数都不是个位数,所以不能通过直接比较各个数的大小来决定拼接顺序拼出最小的数字
我们可以这样: 根据两个数拼接后的数字的大小关系来决定两个数拼接的顺序 比如32和321这两个数,它们可能拼接成32321和32132,比较这两个拼接后的数字大小,小的那一个就是我们想要的32和321的拼接顺序,显然为321拼在32前面
为需要排序的数组list设置一个比较器Compartor,Compartor的compare方法(compareTo是compare方法的方法)用来告诉代码应该怎么去比较两个实例(传入的两个参数),然后根据比较结果进行排序,compareTo内部其实也是直接调用的compare方法. 对象大于目标参数,返回1 对象小于目标参数,返回-1 对象等于目标参数,返回0 compare比较完排序的两个参数得出返回值 sort方法根据返回值对两个参数进行排序,默认升序排序
list.sort(new Comparator() {
@Override
public int compare(String o1, String o2) {
String a1=o1+o2;
String a2=o2+o1;
return a1.compareTo(a2);//按字典排序(a1与a2的ASC码的差值)去比较两个字符串,返回一个整数
// return Integer.parseInt(a1)-Integer.parseInt(a2);
}
});
最后将排序好的数进行拼接就就是我们想要的最小数字
public class jz32{
public static void main(String[] args) {
PrintMinNumber(new int[]{3,32,321});
}
public static String PrintMinNumber(int [] numbers) {
ArrayList list=new ArrayList();
for(int x:numbers){
list.add(x+"");
}
//排序
list.sort(new Comparator() {
@Override
public int compare(String o1, String o2) {
String a1=o1+o2;
String a2=o2+o1;
return a1.compareTo(a2);//按字典排序(a1与a2的ASC码的差值)去比较两个字符串,返回一个整数
// return Integer.parseInt(a1)-Integer.parseInt(a2);
}
});
list.forEach(l->{
System.out.println(l);
});
/*//也可使用lombda表达式(使代码变的更加简洁紧凑)
list.sort((o1,o2)-> {
String a1=o1+o2;
String a2=o2+o1;
return a1.compareTo(a2);
});
*/
//拼接
StringBuilder ans=new StringBuilder();//StringBuilder处理字符串,比直接字符串相加效率高
for(String x:list){
ans.append(x);
}
return ans.toString();
}
}