力扣剑指offer之数组组成最小数

题目:
给定一个整数型数组,数组内所有数字都是非负的,让你求出由这个数组内所有数字组成的最小数。
例子:【10,2】 输出:102.
解释:最小数肯定不能是210,所以应该是102.

解析:这个题目在力扣上给定的标签是中等题,但是如果你发现不了问题的本质,该题并不好写出正确答案。需要考虑的点有:
1)最小数,那也就是说我们应该选择第一个字符是最小字符的数作为结果的第一个组成部分。比如说【10,2】,第一个数它的第一个字符为1,第二个数,第一个字符为2,所以我们选择第一个数作为结果的第一个组成部分。
2)然后再从剩下的数组内找第一个字符最小的数作为结果的第二个组成部分,以此类推。这道题就这样解决了???不是的,别忘了,还有3,30,31,32这种同时出现的情况呢。因此我们应该在每次比较获得第一个字符最小的数时,要记得比到最后一位,这也是个循环,如果本次字符相等,就往下比。

class Solution01 {
    StringBuilder strBul = new StringBuilder();
    List<String> listNum = new ArrayList<>();

    public String minNumber(int[] nums) {
        if(nums.length == 0)  return "";
        if(nums.length == 1)  return String.valueOf(nums[0]);
        for(int i = 0; i < nums.length; i++){
            listNum.add(String.valueOf(nums[i]));
        }
        String result = recur(listNum);
        return result;
    }

    public String recur(List<String> list){
        if(list.size() == 1){
            strBul.append(list.get(0));
            return strBul.toString();
        }
        String strNum = list.get(0);
        int flag = 0 ;
        for(int i = 1; i < list.size(); i++){
            int m = 0;
            int n = 0;
            while(true){
                if(m < strNum.length() && n < list.get(i).length()){
                    if(strNum.charAt(m) < list.get(i).charAt(n)){
                        strNum = strNum;
                        flag = flag;
                        break;
                    }else if(list.get(i).charAt(n) < strNum.charAt(m)){
                        strNum = list.get(i);
                        flag = i;
                        break;
                    }else{
                        m++; n++;
                    }
                }else{
                    if(strNum.length() < list.get(i).length()){
                        while(n < list.get(i).length()){
                            if(strNum.charAt(m-1) > list.get(i).charAt(n)){
                                strNum = list.get(i);
                                flag = i;
                                break;
                            }else if(strNum.charAt(m-1) < list.get(i).charAt(n)){
                                if(list.get(i).charAt(n) >= list.get(i).charAt(0)){
                                    strNum = strNum;
                                    flag = flag;
                                    break;
                                }else{
                                    strNum = list.get(i);
                                    flag = i;
                                    break;
                                }

                            }else{
                                n++;
                                if(n == list.get(i).length()){
                                    strNum = list.get(i);
                                    flag = i;
                                }
                            }
                        }
                        break;
                    }else if(strNum.length() > list.get(i).length()){
                        while(m < strNum.length()){
                            if(strNum.charAt(m) > list.get(i).charAt(n-1)){
                                if(strNum.charAt(m) >= strNum.charAt(0)){
                                    strNum = list.get(i);
                                    flag = i;
                                    break;
                                }else{
                                    strNum = strNum;
                                    flag = flag;
                                    break;
                                }
                            }else if(strNum.charAt(m) < list.get(i).charAt(n-1)){
                                strNum = strNum;
                                flag = flag;
                                break;
                            }else{
                                m++;
                                if(m == strNum.length()){
                                    strNum = strNum;
                                    flag = flag;
                                }
                            }
                        }
                        break;
                    }else{
                        strNum = strNum;
                        flag = flag;
                        break;
                    }
                }
            }
        }
        strBul.append(strNum);
        list.remove(flag);
        recur(list);
        return strBul.toString();
    }
}

这个代码大家可以了解看看,真到面试场上,顺利写完这种代码并且还能让面试官不对你有什么不满的情况肯定很少。所以重点在下面这种方法。

你细想,对于两个字符串来说,字符串的比较是如何进行的???是不是就和我们上面讲的思路一样啊,先从第一位字符开始比,如果相等就比较第二位,一直到比出大小。如果不相等直接得到大小。那我们上面说的不就是字符串的比较算法实现过程吗????
我们直接讲数组元素利用String.ValueOf()转化为字符串类型,放入列表中,讲列表进行正序排序。然后讲该正序排序结果字符累加不就得了嘛!

String Test(int[] nums){

        List<String> list = new ArrayList<>();
        for (int num : nums) {
            list.add(String.valueOf(num));  // 或者nums[i]+""
        }

        list.sort((o1,o2) -> (o1+o2).compareTo(o2+o1));

        StringBuilder s = new StringBuilder();
        for (String value : list) {
            /**
             列表 add offer   get poll  remove
             set  add  int a : set   Iterator   hasNext  next()
             map  put get
             */
            s.append(value);
        }
        return s.toString();
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值