2191 将杂乱无章的数字排序(哈希表)

1. 问题描述:

给你一个下标从 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 都会变成 6 。
2. mapping[1] = 9 ,所有数位 1 都会变成 9 。
所以,991 映射的值为 669 。
338 映射为 007 ,去掉前导 0 后得到 7 。
38 映射为 07 ,去掉前导 0 后得到 7 。
由于 338 和 38 映射后的值相同,所以它们的前后顺序保留原数组中的相对位置关系,338 在 38 的前面。所以,排序后的数组为 [338,38,991] 。

示例 2:

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

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-the-jumbled-numbers/

2. 思路分析:

分析题目可以知道我们需要将nums中的数字通过mapping中的映射规则将其映射为另外一个数字,然后根据映射后的数字从小到大排序,最后输出的是映射之后从小到大排序对应的原数字的排列,由于需要建立映射前后数字之间的关系所以我们可以使用哈希表建立这种映射关系,由于多个数字可能映射之后的数字是相等的此时我们可以在哈希表中的键存多一个元素,哈希表中的键为:映射之后的数字和当前数字对应的下标(c++可以使用pair,python可以使用元组或者列表),值为原来的数字,这样映射之后每一个数字都是唯一与原来的数字建立映射关系,然后我们可以对哈希表按照双关键字排序,如果映射后的数字相等那么下标在前面的排在前面,最后将排序之后的哈希表的值(原数字)加入到答案中即可。

3. 代码如下:

from typing import List


class Solution:
    # 求解x映射之后的数字
    def solve(self, x: int, mapping: List[int]):
        # 0需要特殊处理
        if x == 0: return mapping[0]
        # t存储x中的每一位
        t = list()
        while x > 0:
            t.append(x % 10)
            x //= 10
        res = 0
        for i in range(len(t) - 1, -1, -1):
            res = res * 10 + mapping[t[i]]
        return res

    def sortJumbled(self, mapping: List[int], nums: List[int]) -> List[int]:
        mp = dict()
        for i in range(len(nums)):
            x = self.solve(nums[i], mapping)
            mp[(x, i)] = nums[i]
        # 按照映射后的数字由小到大排序, 如果数字相同那么按照下标排在前面的数字排在前面
        mp = sorted(mp.items(), key=lambda x: (x[0], x[1]))
        res = list()
        # mp为包含键值对的元组类型, x[1]表示对应字典的值
        for x in mp:
            res.append(x[1])
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值