banner
NEWS LETTER

Leetcode每日一题1

Scroll down

题目

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

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

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

注意:

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

示例 1:

1
2
3
4
5
6
7
8
9
10
11
输入: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:

1
2
3
输入: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] 。

我的解法:

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def sortJumbled(self, mapping: List[int], nums: List[int]) -> List[int]:
# 定义一个函数,用于获取每个数映射后的值
def get_mapped_num(num: int) -> int:
digits = list(map(int, str(num))) # 将每一个数拆解成各个数位
mapped_digits = [mapping[digit] for digit in digits] # 应用映射规则
return int(''.join(map(str, mapped_digits))) # 将映射后的各数位组合成一个整数

# 使用 sorted 函数和自定义的 key 函数进行排序
return sorted(nums, key=get_mapped_num)

取整数每个数位的方法:

1
2
3
4
5
6
7
8
9
10
# 方法1:使用 str 转换和 join 函数
digits1 = [1, 2, 3, 4, 5]
combined_num1 = int(''.join(map(str, digits1)))

# 方法2:使用数学运算
digits2 = [1, 2, 3, 4, 5]
combined_num2 = 0
for digit in digits2:
combined_num2 = combined_num2 * 10 + digit

函数解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
map(str, digits1)
函数:map
参数:一个函数 str 和一个列表 digits1
作用:将 str 函数应用于 digits1 列表中的每一个元素。这会将所有的整数转换为字符串。
返回值:一个 map 对象,需要通过 list 或其他方式转换为列表进行查看。
例如,如果 digits1 = [1, 2, 3],那么 map(str, digits1) 会返回一个 map 对象,该对象相当于 ['1', '2', '3']。

''.join(iterable)
方法:str.join
参数:一个可迭代对象 iterable,通常是一个字符串列表。
作用:将 iterable 中的所有字符串连接成一个单一的字符串。字符串之间用调用该方法的字符串(这里是空字符串 '')进行连接。
返回值:一个新的字符串。

sorted(iterable, *, key=None, reverse=False)
函数:sorted
参数:
iterable: 要排序的可迭代对象。
key: (可选)一个接受单个参数的函数,用于从每个元素中提取一个用于排序的键。
reverse: (可选)布尔值。如果设置为 True,则元素将以降序排列。

key 参数
key 参数接受一个函数(在这里是 get_mapped_num),该函数应当接受一个参数(从可迭代对象 iterable 中取出)并返回一个值,该值将用于排序。

例如,假设 nums = [3, 1, 4, 1, 5],并且 key 函数是 get_mapped_num。在排序过程中,sorted 函数会用 get_mapped_num 函数来获取每个元素的“键”(或排序依据),然后根据这些“键”来排序。

Leetcode推荐解法

1
2
3
4
5
6
7
8
9
10
class Solution:
def sortJumbled(self, mapping: List[int], nums: List[int]) -> List[int]:
# 制作翻译表
tab = str.maketrans("0123456789", "".join(map(str, mapping)))
# 自定义排序: (num2map,idx)
return sorted(nums, key=lambda x: int(str(x).translate(tab)))

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

函数解释

1
2
3
4
5
6
7
8
9
10
11
12
13
str.maketrans(x, y=None, z=None)
方法:str.maketrans
参数:两个或三个字符串参数(这里只用了两个)。
作用:返回一个用于字符串转换的映射表。
返回值:一个转换表,该表可以用于 str.translate 方法。
在这里,str.maketrans("0123456789", "".join(map(str, mapping))) 创建了一个将数字字符 '0''9' 映射到 mapping 中相应元素的转换表。

str.translate(table)
方法:str.translate
参数:一个转换表。
作用:使用转换表来替换字符串中的字符。
返回值:一个新的字符串。
在这里,str(x).translate(tab) 使用 tab 转换表将字符串 x 中的字符替换为映射后的字符。

I'm so cute. Please give me money.

其他文章
cover
Python入门1
  • 23/08/18
  • 10:55
  • 125
  • 1
请输入关键词进行搜索