数字数组能组成的最小数值
把数组排成最小的数
http://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993
我的解法:暴力全排列+剪枝
dfs进行全排列,期间会比较已知最小值和当前已选数字补全0的情况下的大小,可以剪掉一部分递归树。
合理的解法:类似排序,a+b拼接成的数字长度和b+a相同,如果int(a+b)>int(b+a),那么b就应该在a的前面。让所有相邻的两个数字都形成这样的大小关系,这不就是排序么? 写一个比较方法,调用库里的排序方法即可。
暴力解法
import java.util.ArrayList; public class Solution { String minNumberStr = ""; public String zFillZeros(String str, int l){ int l2 = str.length(); StringBuilder tmp = new StringBuilder(str); for(int i=l2;i<l;i++){ tmp.append("0"); } return tmp.toString(); } public void dfs(String number, int allL, String[] nums, boolean[] flag){ // 第一个数 if(number.length()==allL){ if(minNumberStr.equals("")){ minNumberStr = number; }else { if(Long.parseLong(minNumberStr)>Long.parseLong(number)){ minNumberStr = number; } } return; } // 剪枝 if(!minNumberStr.equals("")){ String tempStr = zFillZeros(number, allL); if(Long.parseLong(minNumberStr) < Long.parseLong(tempStr)){ return; } } int numSize = nums.length; for(int i=0;i<numSize;i++){ if(flag[i]){ continue; } flag[i]=true; dfs(number+nums[i], allL, nums, flag); flag[i]=false; } } public String PrintMinNumber(int [] numbers) { int l = numbers.length; if(l==0){ return ""; } String[] nums = new String[l]; boolean[] flag = new boolean[l]; int allL = 0; for(int i=0;i<l;i++){ nums[i] = String.valueOf(numbers[i]); allL+=nums[i].length(); flag[i] = false; } String number = ""; dfs(number, allL, nums, flag); return minNumberStr; } }
合理解法
import java.util.Arrays; public class Solution { public String PrintMinNumber(int [] numbers) { Integer[] numbers2 = new Integer[numbers.length]; for(int i=0;i<numbers.length;i++){ numbers2[i] = numbers[i]; } Arrays.sort(numbers2, (o1, o2) -> { Long number1 = Long.parseLong(o1+""+o2); Long number2 = Long.parseLong(o2+""+o1); if(number1>number2){ return 1; }else { return -1; } }); StringBuilder sb = new StringBuilder(); for (Integer i: numbers2) { sb.append(i); } return sb.toString(); } }