剑指offer30--将数组排列成最小的数

来源:互联网 发布:java接收命令行参数 编辑:程序博客网 时间:2024/06/06 07:25

题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

例子说明:例如输入数组{3, 32, 321},则扫描输出这3 个数字能排成的最小数字321323。

编程思想:
(1)找到一个排序的规则,这个规则不是简单的比较两个数的大小,比如321和33,我们应该把321放到前面,而不是将数字比较小的33放到前面。根据这个规则创建一个比较器。
(2)使用上面创建的比较器来对数组进行排序,也就是将该放到前面的数字放到前面。在这里我们使用的是快速排序的方式来排序的。
(3)通过StringBuider Builder的append的方法来将字符串相连

注意问题:String中compareTo()方法进行了重写,所以我们可以直接使用。
package 剑指offer;import java.util.*;/*题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。*/public class Test33 {//定义一个比较特殊的比较器,用来比较mn和nm的大小public static class MComparator implements Comparator<String>{public int compare(String str1, String str2){if(str1 == null || str2 == null){throw new IllegalArgumentException("Not Null");}String s1 = str1 + str2;String s2 = str2 + str1;return s1.compareTo(s2);}}    /**     * 快速排序算法     *     * @param array      待排序数组     * @param start      要排序的起始位置     * @param end        要排序的结束位置     * @param comparator 自定义的比较器     */public static void quickSort(String ary[], int start, int end, Comparator<String> comparator){if(start < end){String strFlag = ary[start];int left = start;int right = end;while(start < end){while(start < end && comparator.compare(ary[end], strFlag) >= 0){end--;}ary[start] = ary[end];while(start < end && comparator.compare(ary[start], strFlag) <= 0){start++;}ary[end] = ary[start];// 如此循环往复}  ary[start] = strFlag;              quickSort(ary, left, start - 1, comparator);              quickSort(ary, start + 1, right, comparator);        }}public static String printMinNumber(String[] array) {        if (array == null || array.length < 1) {            throw new IllegalArgumentException("Array must contain value");        }        MComparator comparator = new MComparator();        quickSort(array, 0, array.length - 1, comparator);        StringBuilder builder = new StringBuilder(256);        for (String s : array) {            builder.append(s);        }        return builder.toString();    }public static void main(String args[]){        String[] data = {"3", "5", "1", "4", "2"};        System.out.println(printMinNumber(data));        String[] data2 = {"3", "32", "321"};        System.out.println(printMinNumber(data2));}}


s1.compareTo(s2)中如果s1<s2,则返回负数
1 0
原创粉丝点击