数字数组能组成的最小数值

把数组排成最小的数

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();
    }
}
全部评论

相关推荐

机械打工仔:有说的你怀疑一下就行了,直接问也太实诚了
点赞 评论 收藏
分享
07-02 10:39
门头沟学院 Java
Steven267:说点真实的,都要秋招了,还没有实习,早干嘛去了,本来学历就差,现在知道急了,而且你这个简历完全可以写成一页,劣势太大了,建议转测试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务