思路:
1.套用之前的全排列方法,递归得到每种字符串
2.字符串转数值,取尝试更新最小值
3.返回记录的最小值
踩坑:
1.字符串太大,用int long double装不下
2.学会了用大数类 BigInter 构造时直接收入字符串
3.大数之间比较 用 x1.compareTo(x2)
import java.util.ArrayList;
import java.math.BigInteger;
public class Solution {
static BigInteger min=new BigInteger("99999999999999999999999999");
public String PrintMinNumber(int [] numbers) {
//套用之前做过的字符串全排列,得到结果后,尝试更新最小数记录
if(numbers.length==0){
return "";
}
//把数组转化为ArryList able
ArrayList able = new ArrayList();
for (int i = 0; i <=numbers.length-1 ; i++) {
able.add(numbers[i]+"");
}
//开一个空的起始StringBuffer
StringBuffer start=new StringBuffer();
//前者表示当前字符串,后者表示剩余可用字符集
fun(start,able);
String result=min+"";
return result;
}
public void fun(StringBuffer result,ArrayList able){
//接收当前字符串 开res副本接收result、able1接收able,且以便回溯
StringBuffer res=new StringBuffer(result);
ArrayList able1=new ArrayList(able);
//如果可用数组为空
if(able.size()==0){
//尝试更新最小树记录
BigInteger num=new BigInteger(res.toString());
if(num.compareTo(min) < 0){
min=num;
};
}
if(able.size()!=0) {
//从可用字符集中取一个加到当前字符串
for (int i = 0; i <=able.size()-1 ; i++){
res.append(able.get(i));
able1.remove(i);
fun(res, able1);
//这里要回溯,恢复到刚传入的result和able值
able1=new ArrayList(able);
res=new StringBuffer(result);
}
}
}
}
京公网安备 11010502036488号