刷题的日常-将杂乱无章的数字排序

94 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情

刷题的日常-2022年8月23日

一天一题,保持脑子清爽

将杂乱无章的数字排序

来自leetcode的 2191 题,题意如下:

给你一个下标从 0开始的整数数组mapping,它表示一个十进制数的映射规则,mapping[i] = j表示这个规则下将数位i映射为数位 j。
一个整数 映射后的值为将原数字每一个数位 i(0 <= i <= 9)映射为mapping[i]。
另外给你一个整数数组nums,请你将数组nums中每个数按照它们映射后对应数字非递减顺序排序后返回。
注意:

  • 如果两个数字映射后对应的数字大小相同,则将它们按照输入中的 相对顺序排序。
  • nums中的元素只有在排序的时候需要按照映射后的值进行比较,返回的值应该是输入的元素本身。

理解题意

我们可以从题意中提取的条件如下:

  • 给定一个数组 和 一组映射关系
  • 讲数组内的数进行映射
  • 然后将映射过后的数字排序后返回

做题思路

根据题目的描述,我们可以先进行映射,排序用优先级队列。往优先级队列里面添加数据,就相当于进行了排序,最后将数据放进数组中返回即可。

代码实现

代码实现如下:

public class Solution {
    public int[] sortJumbled(int[] mapping, int[] nums) {
        int index = 0;
        Queue<Pair> queue = new PriorityQueue<>(nums.length, (o1, o2) -> {
            if (o1.convertNum != o2.convertNum) {
                return Integer.compare(o1.convertNum, o2.convertNum);
            }
            return Integer.compare(o1.index, o2.index);
        });
        for (int i = 0; i < nums.length; i++) {
            queue.add(new Pair(mapNum(mapping, nums[i]), nums[i], i));
        }

        while (!queue.isEmpty()) {
            nums[index++] = queue.poll().num;
        }
        return nums;
    }
    private int mapNum(int[] mapping, int nums) {
        int len = 1, tmp = 0, num = nums;
        if (num == 0) {
            tmp += mapping[num % 10] * len;
        }
        while (num > 0) {
            tmp += mapping[num % 10] * len;
            len *= 10;
            num /= 10;
        }
        return tmp;
    }
    static class Pair {
        public Pair(int convertNum, int num, int index) {
            this.convertNum = convertNum;
            this.num = num;
            this.index = index;
        }

        int convertNum;
        int num;
        int index;
    }
}