LeetCode Everyday - 将杂乱无章的数字排序

112 阅读1分钟

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

将杂乱无章的数字排序

给你一个下标从 0 开始的整数数组 mapping ,它表示一个十进制数的映射规则,mapping[i] = j 表示这个规则下将数位 i 映射为数位 j 。

一个整数 映射后的值 为将原数字每一个数位 i (0 <= i <= 9)映射为 mapping[i] 。

另外给你一个整数数组 nums ,请你将数组 nums 中每个数按照它们映射后对应数字非递减顺序排序后返回。

注意:

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

示例1:

输入:mapping = [8,9,4,0,2,1,3,5,7,6], nums = [991,338,38]
输出:[338,38,991]
解释:
将数字 991 按照如下规则映射:
1. mapping[9] = 6 ,所有数位 9 都会变成 62. mapping[1] = 9 ,所有数位 1 都会变成 8 。
所以,991 映射的值为 669338 映射为 007 ,去掉前导 0 后得到 738 映射为 07 ,去掉前导 0 后得到 7 。
由于 33838 映射后的值相同,所以它们的前后顺序保留原数组中的相对位置关系,33838 的前面。
所以,排序后的数组为 [338,38,991] 。

示例2:

输入:mapping = [0,1,2,3,4,5,6,7,8,9], nums = [789,456,123]
输出:[123,456,789]
解释:789 映射为 789456 映射为 456123 映射为 123 。所以排序后数组为 [123,456,789] 。

提示:

  • mapping.length == 10
  • 0 <= mapping[i] <= 9
  • mapping[i] 的值 互不相同 。
  • 1 <= nums.length <= 3 * 104
  • 0 <= nums[i] < 109

解题思路:

1. 遍历nums, 根据mapping获取每个元素的映射值, 将元素值和映射值放入一个对象中
2. 根据映射值对对象排序, 然后取出排序后对象每个元素的元素值取出即可

我的答案:

/**
 * @param {number[]} mapping
 * @param {number[]} nums
 * @return {number[]}
 */
var sortJumbled = function(mapping, nums) {
    // 获取映射值, 放入对象中
    const _nums = nums.map(num => ({num, reflect: +`${num}`.split('').map(l => mapping[l]).join('')}))
    // 将对象按照映射值排序
    _nums.sort((a,b) => a.reflect - b.reflect)
    // 遍历取出数值
    return _nums.map(item => item.num)
};

最后

如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )