《剑指offer》刷题——【时间效率】面试题45:把数组排成最小的数(java实现)
一、题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的
一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
二、题目分析
方法一:全排列,再比较
- n个数全排列共有n!个排列
- 求出所有数字的全排列,并将全排列拼起来
- 然后求拼起来的数字的最小值
方法二:寻找排序规则
- 比较两个数字组合之后的大小,即对于数字a b,有ab、ba两种组合,要求打印出最小的组合数字
- 如何拼接、比较大小?
- 直接用数值:a、b都是int,但拼接之后会不会溢出,这是隐形的大数问题
- 解决方案:把数字转换为字符串,使用字符串比较规则
三、代码实现
import java.util.ArrayList;
import java.util.List;
import java.util.Comparator;
import java.util.Collections;
public class Solution {
public String PrintMinNumber(int [] numbers) {
if(numbers==null || numbers.length<1){
return "";
}
List<Integer> list = new ArrayList<>();
for(int i=0; i<numbers.length;i++){
list.add(numbers[i]);
}
Collections.sort(list, new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2){
String str1 = o1 + "" + o2;
String str2 = o2 + "" + o1;
return str1.compareTo(str2);
}
});
StringBuilder sb = new StringBuilder();
for(int i=0; i<numbers.length;i++){
sb.append(list.get(i));
}
return sb.toString();
}
}