剑指Offer第二十一题:把数组排成最小的数

题目描述

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

题目分析

刚开始我看到这个题,我就想到的是排序,在各种思路中越走越远,于是就小百度了一下;不过感觉从这个题获得的新的力量,https://blog.csdn.net/u012050154/article/details/52054010

上面这篇博客就是关于比较器的使用的,有了这个感觉就比较简答很多。这个题的思路就是numbers[i]+""+numbers[i+1]和numbers[i+1]+""+numbers[i],的大小。

源代码

重写搜索比较器方法

    public static String PrintMinNumber(int[] numbers) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < numbers.length; i++) {
            list.add(numbers[i]);
        }
        String res ="";
        
        //Collections.sort(list),这是最原始的方法,他是按照自然数的升序排序的,在sort中重写比较器,那么sort的排序就是按照构造器中的形式来
        //排序的,new Comparator<Integer>(){.....
        Collections.sort(list,new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                String s1=o1+""+o2;
                String s2=o2+""+o1;
                return s1.compareTo(s2);
            }
        });
        
        for(int k:list)
            res+=k;
        return res;
    }

 

方法二:按照比较排序  

 1     public static String PrintMinNumber1(int[] numbers) {
 2         String res="";
 3         for(int i=0;i<numbers.length;i++) {
 4             for(int j=i+1;j<numbers.length;j++) {
 5                 String str1=numbers[i]+""+numbers[j];
 6                 String str2=numbers[j]+""+numbers[i];
 7                 if(Integer.parseInt(str1)>Integer.parseInt(str2)) {
 8                     int temp=numbers[i];
 9                     numbers[i]=numbers[j];
10                     numbers[j]=temp;
11                 }
12             }
13         }
14         for(int k:numbers)
15             res+=k;
16         return res;
17     }

 

 

感觉写得不错,推荐一个吧

posted @ 2018-09-09 16:23  轻抚丶两袖风尘  阅读(118)  评论(0编辑  收藏  举报