题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
方法一:暴力法
将数组中的元素进行全排列,找出排列后最小的一个组合
import java.util.ArrayList;
public class Solution {
public String PrintMinNumber(int [] numbers) {
if(numbers==null||numbers.length==0)
return "";
ArrayList<String> res=new ArrayList();
func(res,numbers,0,numbers.length);
Long min=Long.MAX_VALUE;
for(String str:res){
if(Long.parseLong(str)<min){
min=Long.parseLong(str);
}
}
return String.valueOf(min);
}
public void swap(int[]numbers,int x,int y){
int temp=numbers[x];
numbers[x]=numbers[y];
numbers[y]=temp;
}
public void func(ArrayList<String> res,int[] numbers,int start,int len){
if(start==len){
StringBuffer sb=new StringBuffer();
for(int i=0;i<len;i++){
sb.append(numbers[i]);
}
res.add(sb.toString());
return;
}
for(int i=start;i<len;i++){
swap(numbers,i,start);
func(res,numbers,start+1,len);
swap(numbers,i,start);
}
}
}
方法二:通过判断A+B和B+A的大小就能判断出应该将那个元素放在前面,将数组中的所有元素通过两个两个比较,将数组中的元素排序成为拼接后最小的数
import java.util.ArrayList;
public class Solution {
public String PrintMinNumber(int [] numbers) {
int len=numbers.length;
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
String x=numbers[i]+""+numbers[j];
String y=numbers[j]+""+numbers[i];
if(Integer.parseInt(x)>Integer.parseInt(y)){
int temp=numbers[j];
numbers[j]=numbers[i];
numbers[i]=temp;
}
}
}
StringBuffer sb=new StringBuffer();
for(int x:numbers){
sb.append(x);
}
return sb.toString();
}
}