数组的字典排序

前端时间碰到一个题目很有趣,分享一下:

题目:给你一个不重复的无序整型数组nums,要求输出数组的字典排序

字典排序不是普通的排序,他需要对数字的每一位进行排序,
如无序数组:nums=[12, 14, 11, 39, 339, 345, 1, 2, 4, 555, 501, 45, 29, 23, 25]
输出字典序为:[1, 11, 12, 14, 2, 23, 25, 29, 339, 345, 39, 4, 45, 501, 555]

根据leetcode上面大神提供的1-n的数字典排序解法宫水三叶大神加以改造,就可以写出适合的解法
在这里插入图片描述
如上图,主要的思想是对多叉树进行进行递归,第一层根节点是0,可以省略;第二层是:1、2、3…9,第三层是两位数:10,11,12,。。。。19, 21,22,23.。。29,。。。。。。91,92,。。。99;第四层是三位数,100,101,。。。。109,110,111,112,。。。119,。。。190,191,192,。。。199;第五层是四位数,依次类推
详细代码如下:

public class ArrayToLexicalOrder {

    public static void main(String[] args) {
        System.out.println(arrayToLexicalOrder(new int[]{12, 14, 11, 39, 339, 345, 1, 2, 4, 555, 501, 45, 29, 23, 25}));
    }

    public static List<Integer> arrayToLexicalOrder(int[] nums) {
        // 获取最大的数
        int max = getMax(nums);
        List<Integer> resList = new ArrayList<>();
        // 数组转为List,方便后面判断使用
        List<Integer> targetList = Arrays.stream(nums).boxed().collect(Collectors.toList());
        // 递归个位开始
        for (int i = 1; i <= 9; i++) {
            dfs(i, max, targetList, resList);
        }
        return resList;
    }

    private static int getMax(int[] nums) {
        if (nums == null || nums.length == 0) return Integer.MIN_VALUE;
        int max = nums[0];
        for (int i = 1; i < nums.length; i++) {
            if (max < nums[i]) max = nums[i];
        }
        return max;
    }

    private static void dfs(Integer cur, Integer max, List<Integer> targetList, List<Integer> resList) {
        // 设置最大值,超过了,意味着递归可以结束了
        if (cur > max) return;
        // 如果当前数字在列表中,加入到结果列表
        if (targetList.contains(cur)) resList.add(cur);
        // dfs以cur开头的各个数值(如cur=2,这里的递归范围是:20、21、22、23....29)
        for (int i = 0; i <= 9; i++) {
            dfs(cur * 10 + i, max, targetList, resList);
        }
    }
}

输出结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值