把数组排成最小数

第三十一题:把数组排成最小数

 

题目描述

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

 

思路:

         穷举法(暴力解):

                                                 把数组中的数字组合成所有可能出现的result[],在比较result数组中最小的数

                                                 缺点:如果数组中的数比较多,那么组合的操作太耗时。

 

具体实现如下图所示:

把数组排成最小数_第1张图片

 

具体实现代码如下:

public class Solution {
     public String printMinNumber(int [] numbers) {
        if(numbers == null || numbers.length == 0){
            return "";
        }
        // 组合result数组
        List result = new ArrayList();
        for (int num : numbers){
            StringBuilder sb = new StringBuilder("" + num);
            for (int number : numbers){
                if (number != num){
                    sb.append(number);
                }
            }
            result.add(sb.toString());
        }
        // 默认的从小到大排序
        Collections.sort(result);
        // 返回最小的
        return result.get(0);
    }
}

 

思路:

        给数组排序,排序好的结果整体看起来是排序后的最小值,例如{ 321, 32, 3}这个数组的整体可看为321 32 3

        那么这个排序的规则该怎么进行判断呢?是按照大小排序么?大小排序的结果为:小->大3 32 321

                                                                                                                                          大->小321 32 3

        看起来大->小的结果是对的。那么我们再一次进行举例子,例如{321,11,1}        大->小321 11 1

        很显然结果不对,看来大小排序肯定得不到我们想要的最小数字。

        如果按照字典排序呢?例如{ 321, 32, 3}   32 < 321  整体的结果为32 321 > 321 32显然字典序也不能解决问题

        那么我们就要自定义比较规则:

                比较两个字符串的大小时,先将两个字符串拼接起来 a+b与 b+a进行比较

                ab > ba  =>  a>b

                ab < ba  =>  a

                ab = ba  =>  a=b

 

具体实现如下图所示:

把数组排成最小数_第2张图片

 

具体实现代码如下:

public class Solution {
    public String PrintMinNumber(int [] numbers) {
        // 代码的鲁棒性
        if(numbers == null || numbers.length == 0){
            return "";
        }
        // 将数字数组转换成字符串数组
        String[] array = new String[numbers.length];
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < numbers.length; i++){
            array[i] = String.valueOf(numbers[i]);
        }
        // 进行自定义的排序比较
        Arrays.sort(array,new Comparator(){
            @Override
            public int compare(String str1,String str2){
                // 比较规则
                String c1 = str1 + str2;
                String c2 = str2 + str1;
                return c1.compareTo(c2);
            }
        });
        for(int i = 0; i < array.length;i++){
            sb.append(array[i]);
        }
        return sb.toString();
    }
}


// 这个答案比较好的利用了lambda表达式,思路与上述相同
// 引用牛客网大神 Duqcuid
public class Solution {
    public String PrintMinNumber(int [] numbers) {
        String[] strs = new String[numbers.length];
        for(int i = 0; i < numbers.length; i++)
            strs[i] = String.valueOf(numbers[i]);
        // sorted  reduce
        return Arrays.stream(strs)
                    .sorted((x, y) -> (x + y).compareTo(y + x))
                    .reduce("", (x, y) -> x + y);
    }
}

 

NowCoder(Online Coding, Please Click)

你可能感兴趣的:(剑指offer)