剑指Offer第二十一题:把数组排成最小的数
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
题目分析
刚开始我看到这个题,我就想到的是排序,在各种思路中越走越远,于是就小百度了一下;不过感觉从这个题获得的新的力量,https://blog.csdn.net/u012050154/article/details/52054010
上面这篇博客就是关于比较器的使用的,有了这个感觉就比较简答很多。这个题的思路就是numbers[i]+""+numbers[i+1]和numbers[i+1]+""+numbers[i],的大小。
源代码
重写搜索比较器方法
public static String PrintMinNumber(int[] numbers) { ArrayList<Integer> list = new ArrayList<>(); for (int i = 0; i < numbers.length; i++) { list.add(numbers[i]); } String res =""; //Collections.sort(list),这是最原始的方法,他是按照自然数的升序排序的,在sort中重写比较器,那么sort的排序就是按照构造器中的形式来 //排序的,new Comparator<Integer>(){..... Collections.sort(list,new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { String s1=o1+""+o2; String s2=o2+""+o1; return s1.compareTo(s2); } }); for(int k:list) res+=k; return res; }
方法二:按照比较排序
1 public static String PrintMinNumber1(int[] numbers) { 2 String res=""; 3 for(int i=0;i<numbers.length;i++) { 4 for(int j=i+1;j<numbers.length;j++) { 5 String str1=numbers[i]+""+numbers[j]; 6 String str2=numbers[j]+""+numbers[i]; 7 if(Integer.parseInt(str1)>Integer.parseInt(str2)) { 8 int temp=numbers[i]; 9 numbers[i]=numbers[j]; 10 numbers[j]=temp; 11 } 12 } 13 } 14 for(int k:numbers) 15 res+=k; 16 return res; 17 }
感觉写得不错,推荐一个吧