剑指offer39

218 阅读1分钟

题目描述

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

解题思路分析

  • 一种很简单暴力的方法就是依次将数组中的全排列,然后比较,但是这种方法明显不行,而且会有两个很大的问题,一个是时间复杂度问题,数组中的n个数字就会有n!个全排列,还有就是int越界问题
  • 然后我们其实就可以分析分析一下,假设当我们在比较n,m时,我们比较nm和mn的大小来确定n,m的位置,我们定义如果nm<mn为n<m,这样就会减小时间复杂度,但是这里同样会有可能越界的问题,所以我们需要使用String,而且java中可以使用Collections的sort方法进行排序,指定Comparator就可

代码实现

public String printMinNumber(int[] numbers) {
    if (numbers == null || numbers.length <= 0) {
        return "";
    }
    int length = numbers.length;
    List<Integer> list = new ArrayList<Integer>();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < length; i++) {
        list.add(numbers[i]);
    }
    //利用Collections的sort方法,同时定义排序规则
    Collections.sort(list,(n, m) -> {
        String s1 = n + "" + m;
        String s2 = m + "" + n;
        return s1.compareTo(s2);
    });
    for (int i : list) {
        sb.append(i);
    }
    return sb.toString();
}