把数组排成最小的数
第一种方法:耗时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();
}
京公网安备 11010502036488号