题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
1、想法很简单,求这三个数做一个全排列,然后将其最小数输出即可!
import java.util.*;
public class Solution {
public void swap(int [] numbers,int i,int j){
int tmp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = tmp;
}
public ArrayList<String> Permutation(ArrayList<String> list,int [] numbers,int start,int end){
if(start == end){
String str = "";
for(int i=0;i<numbers.length;i++){
str += numbers[i];
}
list.add(str);
//return list;
}else{
for(int i=start;i<=end;i++){
swap(numbers,start,i);
list = Permutation(list,numbers,start+1,end);
swap(numbers,start,i);
}
}
return list;
}
public String PrintMinNumber(int [] numbers) {
if(numbers.length == 0){
return "";
}
ArrayList<String> list = new ArrayList();
list = Permutation(list,numbers,0,numbers.length-1);
Collections.sort(list);
return list.get(0);
}
}
2、没必要把每一种情况都求出来呀!更简单的是:转换成字符数组,直接对其字典排序,然后连接起来即可!
补充begin:
比较两个数字,即给定两个数字m和n,我们要确定一个规则判断m和n哪个应该排在前面,而不是仅仅比较这两个数的大小。
m和n的拼接原则:mn或者nm。需要根据mn和nm的大小来定义排序规则。
由于m和n都是int能表达的数,把它们拼接成nm或mn可能就溢出了。==》所以还是一个大数问题。===》转换为字符串。
补充end;
sort()函数有两种:Collections.sort(。。。) 和 Arrays.sort(。。。。);
(1)Collections.sort()的参数是List类型,而Arrays.sort(。。。。)的参数是一个数组类型!
(2)这两种的排序都可以有第二个参数Comparator:
Arrays.sort(T[],Comparator<? super T> c);
Collections.sort(List<T> list,Comparator<? super T> c);
(应该不能做字典排序,而是根据str1+str2 与 str2+str1排序)
代码如下:
import java.util.*;
public class Solution {
public String PrintMinNumber(int [] numbers) {
if(numbers.length == 0){
return "";
}
ArrayList<String> list = new ArrayList();
for(int i=0;i<numbers.length;i++){
list.add(""+numbers[i]);
}
//注意:这里的String
Collections.sort(list,new Comparator<String>(){
public int compare(String a,String b){
String str1 = a + b;//这里很巧妙
String str2 = b + a;
return str1.compareTo(str2);
}
});
String res = "";
for(int i=0;i<list.size();i++){
res += list.get(i);
}
return res;
}
}
感觉这个比较器很巧妙!!!不知道能不能写另一种比较器:如果第一位相同,比较第二位,如果没下一位了,则是小的。
Comparator接口,两个对象要使用compareTo方法比较大小,就必须实现Comparator接口的compare方法,比如String就实现了这个方法,所以可以直接使用compareTo进行比较。sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序。
返回正值代表大于,返回0代表等于,返回负值代表小于。这样就可以自定义排序方法。
这个还需要重新学习一下!关于比较规则的重写!