题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路
- 暴力法:找出数组中所有的组合情况,一一对比找最小
- 排序:按照特定的方法排序(使两个字符串组合起来最小,小的那个排前面)
实现
暴力法
public String PrintMinNumber(int [] numbers) { if(numbers.length==0){ return ""; } ArrayList<String> r = f(numbers, 0, numbers.length-1); String min = r.get(0); for(String s:r){ if(s.compareTo(min)<0){ min=s; } } return min; }
//此函数返回所有的遍历情况 public ArrayList<String> f(int[] numbers, int start, int end){ if(start>=end){ ArrayList r= new ArrayList<String>(); r.add(String.valueOf(numbers[start])); return r; } ArrayList r= new ArrayList<String>(); //替换头,以遍历所有的情况 for(int i=start;i<=end;i++){ //swap int temp=numbers[start]; numbers[start]=numbers[i]; numbers[i]=temp; for(String s:f(numbers, start+1, end)){ r.add(String.valueOf(numbers[start])+s); } //交换了的数要再换回来,以便下次继续交换 temp=numbers[start]; numbers[start]=numbers[i]; numbers[i]=temp; } return r; }
排序:
//采用冒泡排序,也可以使用快排等其他排序算法 public String PrintMinNumber(int [] numbers) { if(numbers.length==0){ return ""; } for(int k=0;k<numbers.length;k++){ for(int i=k;i<numbers.length-1;i++){ if(Compare(numbers[i], numbers[i+1)>0){ //swap int temp=number[i]; number[i]=number[i+1]; number[i+1]=temp; } } } //sort complate StringBuilder result=new StringBuilder(); for(int i:numbers){ result.add(String.valueOf(i)); } return result.toString(); }
//具体的两数比较方法 public int Compare(int m, int n){ m_str=String.valueOf(m); n_str=String.valueOf(n); c1=m_str+n_str; c2=n_str+m_str; if(c1.compareTo(c2)<0){ return -1; }else if(c1.compareTo(c2)==0){ return 0; }else{ return 1; } }