7、把数组排成最小的数

╄→尐↘猪︶ㄣ 提交于 2020-01-07 17:47:42

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

1、解题思路
本题最直观的解法就是求出数组中所有数字的全排列,然后比较所有的排列,最后找到最小的排列,但是时间复杂度为O(n!),所以不是一个好的解法。
  换一种思路可以发现,本题实际上希望我们找到一个排序规则,数组根据这个排序规则进行重排之后可以连成一个最小的数字。要确定这样的排序规则,也就是对于两个数字m和n,通过一个规则确定哪个应排在前面。
  根据题目要求,我们可以发现,两个数字m和n能拼接成mn和nm,如果mn<nm,那m应该在前;如果nm<mn,那么n应该在前。因此,我们得到的排序规则如下:
若mn>nm,则m大于n
若mn<nm,则m小于n
若mn=nm,则m等于n
  根据上述规则,我们需要先把数字转换成字符串再进行比较,因为需要拼接起来。比较完之后按顺序连接成一个字符串即可。
2、代码实现

package offer;

import java.util.Arrays;
import java.util.Comparator;

public class PrintMinNumber {
    public static void main(String[] args) {
        int[] array=new int[]{3,32,321};
        String a=printminnumber(array);
        System.out.println(a);
    }
    //comparator可以对任意集合对象进行整体排序
     static class compareStr implements Comparator<String>{
        @Override
        public int compare(String m, String n) {
            String mn=m+n,nm=n+m;
            //若mn小于nm返回-1,相等返回0,大于返回1
            return mn.compareTo(nm) ;
        }
    }

    private static String printminnumber(int[] array) {
        String result="";
        if(array==null||array.length<=0){
            return result;
        }
        int len=array.length;
        String[] str=new String[len];
        for(int i=0;i<len;i++)
            str[i]=String.valueOf(array[i]);
        compareStr c=new compareStr();
        Arrays.sort(str,c);
        for(String s:str)
            result +=s;
        return result;
    }
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!