题目链接
牛客网在线oj题——把数组排成最小的数
题目描述
输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组[3,32,321],则打印出这三个数字能排成的最小数字为321323。
1.输出结果可能非常大,所以你需要返回一个字符串而不是整数
2.拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
数据范围:
0<=len(numbers)<=100
题目示例
示例1
输入:
[11,3]
返回值:
“113”
示例2
输入:
[]
返回值:
“”
示例3
输入:
[3,32,321]
返回值:
“321323”
解题思路
这道题实际的意思是:将所有数组中的元素拼接成一个字符串,当这个字符串对应的数字比其他情况都小时,对应的拼接顺序是什么
首先数组中所有的元素都添加到整形类型的顺序表中,这样可以用Collections中的sort方法进行排序
Collections.sort需要传入顺序表list和比较方法,创建一个Comparator比较器,重写其中的compare方法
其中o1元素为第一个元素,o2元素为第二个元素,分别将o1o2排序形成的数字和o2o1排序形成的数字进行比较,返回其中较小值
最后再创建一个stringBuffer对象,将排序好的顺序表一一添加进stringBuffer对象中即可得到最终的字符串
完整代码
import java.util.*;
public class Solution {
public String PrintMinNumber(int [] numbers) {
if(numbers == null || numbers.length == 0){
return "";
}
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < numbers.length; i++){
list.add(numbers[i]);
}
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer x, Integer y) {
String xs = x + "" + y;
String ys = y + "" + x;
return xs.compareTo(ys);
}
});
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < numbers.length; i++){
stringBuffer.append(list.get(i));
}
return stringBuffer.toString();
}
}