本文参考自《剑指offer》一书,代码采用Java语言。html
更多:《剑指Offer》Java实现合集 java
输入一个正整数数组,把数组里全部数字拼接起来排成一个数,打印能拼接出的全部数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。数组
很差的方法:求出全部全排列(相似字符串的排列 ),将数字拼起来,最后求出全部的最小值。这效率过低,且没有考虑到大数问题。app
好的方法:观察规律,自行定义一种排序规则。ide
对于数字m和n,能够拼接成mn和nm,若是mn<nm,咱们定义m小于n。反之则相反。利用这个排序规则,从小排到大便可实现题目要求。post
拼接m和n时,要考虑到大数问题,所以将m和n拼接起来的数字转换成字符串处理。由于mn和nm的字符串位数相同,所以它们的大小只须要按照字符串大小的比较规则就能够了。测试
具体实现:将数字存入ArrayList中,经过利用Collections.sort(List<T> list, Comparator<? super T> c)
方法进行排序。Comparator中重写compar()方法来规定比较规则。ui
测试算例 url
1.功能测试(1个数字;多个数字;数字数位有重复)spa
2.特殊测试(null)
//题目:输入一个正整数数组,把数组里全部数字拼接起来排成一个数,打印能拼 //接出的全部数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数 //字能排成的最小数字321323。 public class SortArrayForMinNumber { public String PrintMinNumber(int [] numbers) { if(numbers==null || numbers.length<=0) return ""; ArrayList<String> list = new ArrayList<String>(); for(int number:numbers) list.add(String.valueOf(number)); Collections.sort(list,new Comparator<String>(){ @Override public int compare(String s1,String s2){ String a=s1+s2; String b=s2+s1; return a.compareTo(b); } }); StringBuilder sb= new StringBuilder(); for(String str:list) sb.append(str); return sb.toString(); } }
1.记住Collections.(List<T> list, Comparator<? super T> c)在重写compare()方法的使用。
2.当心大数问题,用字符串解决大数问题。
3.遇到相似排序问题,想一想自定排序规则是否更加方便。