把数组排成最小的数

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

思路:当把数字拼接起来后,可能会超出整数的上限,此时,我们可以将数字转换成字符串来处理。

第一种方法是:我们可以利用字符串的全排列的思想来做这道题,找到最小的数字。

第二种方法是: 我们重新定义一个比较器,让比较器比较(mn与nm)的大小。在此题中,我们假设m=3,n=32,则我们想要的是mn与nm中的较小值。假如我们按这个排序,就可以得出排序后的数组,再转换为字符串即可。

public String PrintMinNumber(int [] numbers) {
        if(numbers.length==0) return "";
        String[] str = new String[numbers.length];
        for(int i=0;i<numbers.length;i++){
            str[i] = String.valueOf(numbers[i]);
        }
        getResult(str,0,numbers.length-1);
        return min;
    }
    String min = "";
    public  String getResult(String[] str,int st,int length){
        
        if(st == length){
            String newStr ="";
            for(int i=0;i<=length;i++){
                newStr+=str[i];
            }
            if(min.equals("")) min = newStr;
            else{
                if(min.compareTo(newStr)>0) min = newStr;
            }
        }else{
            for(int i=0;i<=length;i++){
                swap(str,st,i);
                getResult(str,st+1,length);
                swap(str,st,i);
            }
        }
        return min;
    }
    public void swap(String[] str,int i,int j){
        String ss = str[j];
        str[j] = str[i];
        str[i] = ss;
    }

第二种思路:

public String PrintMinNumber(int [] numbers) {
        if(numbers.length==0) return "";
        String[] str = new String[numbers.length];
        for(int i=0;i<str.length;i++){
            str[i] = String.valueOf(numbers[i]);
        }
        Arrays.sort(str,new cmp());
        String cc = "";
        for(int i=0;i<str.length;i++){
            cc+=str[i];
        }
        return cc;
    }
    class cmp implements Comparator<String>{
        public int compare(String o1,String o2){
            return (o1+o2).compareTo(o2+o1);
        }
    }

 

posted @ 2016-08-31 15:54  樱圃  阅读(159)  评论(0编辑  收藏  举报