知识点/数据结构:数组
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:
最直接的做法应该是先求出逐个数组所有数字的全排列,然后把每个全排列拼起来,最后求出拼起来数字的最小值。n个数字总共有n!中全排列。
这里其实是一个隐形的大数问题:把数字转换成字符型:我们先把数组中的整数转换成字符串,然后定义比较规则,最后把排序的的数组中的数字一次打印出来,时间复杂度:O(nlogn)。
代码如下:《函数覆写从新定义比较规则没搞懂啊2018.12.06 14:33》
//这道题最直接的办法就是(2018.11.21):求出这个数组里边所有数字的全排列,然后把每个排列起来,最后偶求出列后的所有数字的最小值。
import java.util.ArrayList;
import java.util.Collections;
//开始的时候导入的时候少一个包,下面这个
import java.util.Comparator;
public class Solution {
public String PrintMinNumber(int [] numbers) {
int n=0;
String s="";
ArrayList<Integer> list = new ArrayList<Integer>();
n = numbers.length;
for(int i=0;i<n;i++){
list.add(numbers[i]);//将数组放入arrayList中
}
//实现了Comparator接口的compare方法,将集合元素按照compare方法的规则进行排序
Collections.sort(list,new Comparator<Integer>(){
@Override
public int compare(Integer str1, Integer str2) {
// TODO Auto-generated method stub
String s1=str1+""+str2;
String s2=str2+""+str1;
return s1.compareTo(s2);
}
});
for(int i=0;i<n;i++){
s+=list.get(i);
}
return s;
}
}