把数组排成最小的数
第一种方法:耗时21ms
由题可知我们需要对数组中的数进行排序。那么排序需要满足满足什么规则呢?
首先,我们并不能直接用(o1,o2)->o2.compareTo(o1)
,因为很明显当数字一样大时长度并不能作为排序的依据。该题的正确解法为短的字符串循环与长的字符串作比较,代码如下:
public String PrintMinNumber(int [] numbers) { ArrayList<String> arrayList = new ArrayList<String>(); for(int i : numbers){ arrayList.add( i + "" ); } Collections.sort(arrayList, new Comparator<String>() { public int compare(String o1, String o2) { int i = 0, j = 0; while(i < o1.length() || j < o2.length()){ if(j==o2.length()) j-=o2.length(); if(i==o1.length()) i-=o1.length(); if(o1.charAt(i) < o2.charAt(j)){ return -1; }else if(o1.charAt(i) > o2.charAt(j)){ return 1; } i++; j++; } return 0; } }); StringBuilder stringBuilder2 = new StringBuilder(); for(String s : arrayList){ stringBuilder2.append(s); } return stringBuilder2.toString(); }
第二种方法:耗时160ms
这种方法很有意思,利用了贪心的思想,既然整个序列是最小的,那么越靠前的序列肯定也是最小的,任何两个序列的组合也是较小的。同时将两个字符串按不同顺序相加得到的长度也是相等的,此时就可以简单地使用compareTo
的方法来做比较。代码如下:
public String PrintMinNumber(int [] numbers) { ArrayList<String> arrayList = new ArrayList<String>(); for(int i : numbers){ arrayList.add( i + "" ); } Collections.sort(arrayList, (o1,o2)->(o1+o2).compareTo(o2+o1)); StringBuilder stringBuilder2 = new StringBuilder(); for(String s : arrayList){ stringBuilder2.append(s); } return stringBuilder2.toString(); }