栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

class Solution01 {
    StringBuilder strBul = new StringBuilder();
    List 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 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 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) {
            
            s.append(value);
        }
        return s.toString();
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/926861.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号