题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:当把数字拼接起来后,可能会超出整数的上限,此时,我们可以将数字转换成字符串来处理。
第一种方法是:我们可以利用字符串的全排列的思想来做这道题,找到最小的数字。
第二种方法是: 我们重新定义一个比较器,让比较器比较(mn与nm)的大小。在此题中,我们假设m=3,n=32,则我们想要的是mn与nm中的较小值。假如我们按这个排序,就可以得出排序后的数组,再转换为字符串即可。
public String PrintMinNumber(int [] numbers) { if(numbers.length==0) return ""; String[] str = new String[numbers.length]; for(int i=0;i<numbers.length;i++){ str[i] = String.valueOf(numbers[i]); } getResult(str,0,numbers.length-1); return min; } String min = ""; public String getResult(String[] str,int st,int length){ if(st == length){ String newStr =""; for(int i=0;i<=length;i++){ newStr+=str[i]; } if(min.equals("")) min = newStr; else{ if(min.compareTo(newStr)>0) min = newStr; } }else{ for(int i=0;i<=length;i++){ swap(str,st,i); getResult(str,st+1,length); swap(str,st,i); } } return min; } public void swap(String[] str,int i,int j){ String ss = str[j]; str[j] = str[i]; str[i] = ss; }
第二种思路:
public String PrintMinNumber(int [] numbers) { if(numbers.length==0) return ""; String[] str = new String[numbers.length]; for(int i=0;i<str.length;i++){ str[i] = String.valueOf(numbers[i]); } Arrays.sort(str,new cmp()); String cc = ""; for(int i=0;i<str.length;i++){ cc+=str[i]; } return cc; } class cmp implements Comparator<String>{ public int compare(String o1,String o2){ return (o1+o2).compareTo(o2+o1); } }