45.把数组排成最小的数(中等)
2020-02-19 本文已影响0人
今天柚稚了么
考点:本题考查时间效率
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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<String>() {
@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();
}
}