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

一、题目
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例子说明:
例如输入数组{3, 32, 321},则扫描输出这3 个数字能排成的最小数字321323。

String类的compareTo() 方法
返回值
返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方结束。

如果参数字符串等于此字符串,则返回值 0;
如果此字符串小于字符串参数,则返回一个小于 0 的值;
如果此字符串大于字符串参数,则返回一个大于 0 的值。
public class Test {

        /**
         * 自定义的排序比较器,实现算法说明的排序原理
         */
        private static class MComparator implements Comparator {

            @Override
            public int compare(String o1, String o2) {

                if (o1 == null || o2 == null) {
                    throw new IllegalArgumentException("Arg should not be null");
                }

                String s1 = o1 + o2;
                String s2 = o2 + o1;
                return s1.compareTo(s2);
            }
        }

        /**
         * 快速排序算法
         *
         * @param array      待排序数组
         * @param start      要排序的起始位置
         * @param end        要排序的结束位置
         * @param comparator 自定义的比较器
         */
        private static void quickSort(String[] array, int start, int end, Comparator comparator) {

            if (start < end) {
                String pivot = array[start];
                int left = start;
                int right = end;
                while (start < end) {  //"3", "5", "1", "4", "2"
                    while (start < end && comparator.compare(array[end], pivot) >= 0) {
                        end--;
                    }

                    array[start] = array[end];

                    while (start < end && comparator.compare(array[start], pivot) <= 0) {
                        start++;
                    }
                    array[end] = array[start];

                }

                array[start] = pivot;//"2", "1", "3", "4", "5"

                quickSort(array, left, start - 1, comparator);
                quickSort(array, start + 1, end, comparator);
            }
        }

        /**
         * 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,
         * 打印能拼接出的所有数字中最小的一个。
         *
         * @param array 输入的数组
         * @return 输出结果
         */
        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));

            String[] data3 = {"3", "323", "32123"};
            System.out.println(printMinNumber(data3));

            String[] data4 = {"1", "11", "111"};
            System.out.println(printMinNumber(data4));

            String[] data5 = {"321"};
            System.out.println(printMinNumber(data5));
        }
    }

打印结果
30 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。_第1张图片

你可能感兴趣的:(算法)