Python3 maketrans()和translate方法

本文介绍了如何使用Python的maketrans方法创建字符映射表,并结合translate方法实现数字按照特定规则映射后的非递减排序。通过实例演示了如何对给定的整数数组nums进行操作,以便解决LeetCode题目2191中的数字排序问题。

makertrans()和translate()方法

描述

maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。

两个字符串的长度必须相同,为一一对应的关系。

translate()表示建立好转换表后进行的映射操作

例子

# 映射关系
mapping = [8,9,4,0,2,1,3,5,7,6]
# 需要映射的数字
nums = [991,338,38]
# 1. 建立映射关系
tab = str.maketrans("0123456789", "".join(map(str, mapping)))
# 2. 通过映射关系找到要求的数字
res = [int(str(n).translate(tab)) for n in nums]
# 结果[699, 77, 7]

Leetcode

2191. 将杂乱无章的数字排序

题目链接

给你一个下标从 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 都会变成 8 。
所以,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] 。

代码:

class Solution:
    def sortJumbled(self, mapping: List[int], nums: List[int]) -> List[int]:
        tab = str.maketrans("0123456789", "".join(map(str, mapping)))
        return sorted(nums, key=lambda x: int(str(x).translate(tab)))
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_1997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值