45.把数组排成最小的数(中等)

考点:本题考查时间效率

题目描述

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

思路一:全排列

思路二:优化

找到一个排序规则,数组根据这个规则排序之后能排成一个最小的数字。也就是比较两个数字m和n,确定一个规则判断m和n哪个应该排在前面,为了避免int型溢出的问题,将数字转换为字符串。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
public class Solution {
    public String PrintMinNumber(int [] numbers) {
        int len = numbers.length;
         if (numbers == null || len == 0) {
            return "";
        }
        
        String str[] = new String[len];
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < len; i++) {
            str[i] = String.valueOf(numbers[i]);
        }
        //对字符串数组进行排序,传入比较规则,Arrays.sort可以传入一个comparator对象
        Arrays.sort(str, new Comparator() {
            @Override
            public int compare(String s1, String s2) {
                return (s1 + s2).compareTo(s2 + s1);//如果指定的数与参数相等返回0。如果指定的数小于参数返回 -1。如果指定的数大于参数返回 1。
            }
        });
       //拼接结果字符串
        for (int i = 0; i < len; i++) {
            sb.append(str[i]);//排好序的数组中的数字依次打印出来
        }
        return sb.toString();
    }
}

你可能感兴趣的:(45.把数组排成最小的数(中等))