携手创作,共同成长!这是我参与「掘金日新计划 · 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;
}
}