把数组排成最小的数

Posted yi-hui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了把数组排成最小的数相关的知识,希望对你有一定的参考价值。

题目

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。


我的想法

这道题比较容易想到的都是排序,排序后只要将数字拼接成一个字符串就可以了。下面是两个版本的代码,一个是自己实现比较和排序,一个是借助于Collections这个工具类的sort方法,需要重写compare方法。


代码如下

public String PrintMinNumber(int [] numbers) {
   if (numbers == null || numbers.length == 0) return "";
   MyComparator myComparator = new MyComparator();
    List<Integer> list = new ArrayList<Integer>();
    for (int i : numbers) {
        list.add(i);
    }
    Collections.sort(list, myComparator);
    StringBuilder sb = new StringBuilder();
    for (Integer val : list) {
        sb.append(val);
    }
    return sb.toString();
}

private class MyComparator implements Comparator < Integer > {

    @Override
    public int compare(Integer o1, Integer o2) {
        String s1 = String.valueOf(o1);
        String s2 = String.valueOf(o2);
        String str1 = s1+s2;
        String str2 = s2+s1;
        return str1.compareTo(str2);
    }
}


public String PrintMinNumber(int[] numbers) {
    ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
    StringBuilder str = new StringBuilder();

    for (int i : numbers) {
        if (list.isEmpty()) {
            ArrayList<Integer> innerList = new ArrayList<Integer>();
            innerList.add(i);
            list.add(innerList);
        }
        else {
            sortAdd(list, i);
        }

        // System.out.println("本轮循环添加" + i);
        // for(ArrayList<Integer> innerList : list) {
            // for (Integer it : innerList) {
                // System.out.print(it);
            // }
        // }
        // System.out.println();

    }

    for(ArrayList<Integer> innerList : list) {
        for (Integer it : innerList) {
            str.append(it.toString());
        }
    }

    return str.toString();

}

public void sortAdd(ArrayList< ArrayList< Integer >> list, int i) {
    for (ArrayList<Integer> innerList : list) {
        if (getFirst(innerList.get(0)) > getFirst(i)) {
            ArrayList<Integer> newInner = new ArrayList<Integer>();
            newInner.add(i);
            list.add(list.indexOf(innerList), newInner);
            return;
        }
        else if (getFirst(innerList.get(0)) == getFirst(i)) {
            String newInsert = i + "";
            for (Integer it : innerList) {
                String itString = it.toString();
                int length = newInsert.length() > itString.length() ? newInsert.length() : itString.length();
                for (int j = 0; j < length; j++) {
                    char newChar,itChar;
                    if (j < newInsert.length()) {
                        newChar = newInsert.charAt(j);
                    }
                    else{
                        newChar = newInsert.charAt(0);
                    }

                    if (j < itString.length()) {
                        itChar = itString.charAt(j);
                    }
                    else{
                        itChar = itString.charAt(0);
                    }
                    if (newChar < itChar) {
                        innerList.add(innerList.indexOf(it), i);
                        return;
                    }
                }
            }
            innerList.add(i);
            return;
        }
    }
    ArrayList<Integer> newInner = new ArrayList<Integer>();
    newInner.add(i);
    list.add(newInner);

}

public int getFirst(int n) {
    while (n / 10 != 0)
        n /= 10;
    return n;
}

以上是关于把数组排成最小的数的主要内容,如果未能解决你的问题,请参考以下文章

面试题:把数组排成最小的数

剑指offer三十二之把数组排成最小的数

Java 剑指offer(45) 把数组排成最小的数

剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数

剑指offer 面试题33 把数组排成最小的数

把数组排成最小的数