Fork me on GitHub

【Offer】[45]【把数组排成最小的数】

题目描述

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

牛客网刷题地址

思路分析

  1. 对于数字m和n,可以拼接成mn和nm,如果mn<nm,我们定义m小于n。反之则相反。利用这个排序规则,从小排到大即可实现题目要求。
  2. 可以利用Collections.sort中重新定义排序器来重新定义比较规则

测试用例

  1. 功能测试:输入的数组中有多个数字;输入的数组中的数字有重复的数位;输入的数组中只有一个数字。
  2. 特殊输入测试:表示数组的指针为nullptr指针。

Java代码

public class Offer045 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
        
    }

    public static String PrintMinNumber(int [] numbers) {
        return Solution1(numbers);
    }

    /**
     * 重新定义大于和小于的比较规则
     * @param numbers
     * @return
     */
    private static String Solution1(int[] numbers) {
        if(numbers==null || numbers.length<=0){
            return "";
        }
        ArrayList<String> list = new ArrayList<String>();
        for(int num : numbers){
            list.add(String.valueOf(num));
        }
        Collections.sort(list,new Comparator<String>(){
             @Override
            public int compare(String s1,String s2){
                String a = s1+s2;
                String b = s2+s1;
                return a.compareTo(b);
            }
        });
        StringBuffer sb = new StringBuffer();
        for(String str:list){
            sb.append(str);
        }
        return sb.toString();

    }

    private static void test1() {
        int array[] = {3,32,321};
        String minNum = PrintMinNumber(array);
        System.out.println(minNum);
    }

    private static void test2() {

    }
    private static void test3() {

    }
}

代码链接

剑指Offer代码-Java

posted @ 2019-08-19 23:55  这个世界~  阅读(116)  评论(0编辑  收藏  举报