题目描述:
给你三个 正 整数 num1
,num2
和 num3
。
数字 num1
,num2
和 num3
的数字答案 key
是一个四位数,定义如下:
- 一开始,如果有数字 少于 四位数,给它补 前导 0 。
- 答案
key
的第i
个数位(1 <= i <= 4
)为num1
,num2
和num3
第i
个数位中的 最小 值。
请你返回三个数字 没有 前导 0 的数字答案。
代码思路:
这个代码定义了一个名为 Solution
的类,其中包含一个名为 generateKey
的方法。这个方法接收三个整数参数 num1
、num2
和 num3
,并返回一个整数作为结果。下面是该方法的详细思路解释:
- 输入参数:
num1
: 第一个整数。num2
: 第二个整数。num3
: 第三个整数。
- 目标:
- 将这三个整数转换成一个统一的、由它们共同构成的“键”。
- 实现步骤:
- 格式化数字:
- 使用列表推导和字符串格式化函数
f'{num:04}'
将每个数字转换成一个至少四位数的字符串,不足四位的前面补零。这样做的目的是为了确保所有数字在后续处理中有相同的位数,便于字符级别的比较和组合。
- 使用列表推导和字符串格式化函数
- 并行迭代:
- 使用
zip
函数并行迭代这三个格式化后的字符串。zip(*(f'{num:04}' for num in (num1, num2, num3)))
会产生一个迭代器,其中每个元素是一个包含三个字符的元组(分别来自num1
、num2
和num3
在相同位置上的字符)。
- 使用
- 字符级别比较:
- 对于每个元组,使用
min(c)
找到这三个字符中的最小字符(根据 ASCII 码值比较)。这一步实际上是在逐位比较三个数字,选择每个位置上“字典序”最小的字符。
- 对于每个元组,使用
- 合并字符:
- 使用
''.join(...)
将所有选出的最小字符合并成一个新的字符串。
- 使用
- 转换回整数:
- 最后,将这个字符串转换回整数返回。这一步假设生成的字符串表示的是一个有效的整数。
- 格式化数字:
- 示例:
- 假设
num1 = 12
,num2 = 345
,num3 = 67
。 - 格式化后得到
'0012'
,'0345'
,'0067'
。 - 并行迭代并找到最小字符得到
'0012'
(逐位比较:'0'<'0'<'0', '0'<'3'<'0', '1'<'4'<'6', '2'<'5'<'7'`)。 - 合并字符得到
'0012'
。 - 转换回整数得到
12
。
- 假设
代码实现:
class Solution:
def generateKey(self, num1: int, num2: int, num3: int) -> int:
return int(''.join(min(c) for c in zip(*(f'{num:04}'for num in (num1, num2, num3)))))