把数组排成最小的数

第一种方法:耗时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();
    }