在本篇博客中,我们将详细解析 LeetCode 上的第 3270 题——求出数字答案。我们将从问题描述出发,逐步分析解题思路,最后提供 Python 代码实现,并通过示例验证其正确性。
给你三个 正整数 num1
,num2
和 num3
。数字 num1
,num2
和 num3
的 数字答案 key 是一个四位数,定义如下:
1
补零后为 "0001"
。key
的第 i
个数位(1 <= i <= 4
)为 num1
、num2
和 num3
第 i
个数位中的 最小值。key
不包含前导零。例如,"0777"
应返回 777
,"0000"
应返回 0
。示例 1:
输入:num1 = 1, num2 = 10, num3 = 1000
输出:0
解释:
补零后,num1 变为 "0001",num2 变为 "0010",num3 保持不变,为 "1000"。
数字答案 key 的每个位最小值为:
个位:min(1, 0, 0) = 0
十位:min(0, 1, 0) = 0
百位:min(0, 0, 0) = 0
千位:min(0, 0, 1) = 0
所以数字答案为 "0000",即 0。
示例 2:
输入:num1 = 987, num2 = 879, num3 = 798
输出:777
解释:
补零后:
num1 = "0987"
num2 = "0879"
num3 = "0798"
每个位的最小值为:
个位:min(7, 9, 8) = 7
十位:min(8, 7, 9) = 7
百位:min(9, 8, 7) = 7
千位:min(0, 0, 0) = 0
所以数字答案为 "0777",即 777。
示例 3:
输入:num1 = 1, num2 = 2, num3 = 3
输出:1
解释:
补零后:
num1 = "0001"
num2 = "0002"
num3 = "0003"
每个位的最小值为:
个位:min(1, 2, 3) = 1
十位:min(0, 0, 0) = 0
百位:min(0, 0, 0) = 0
千位:min(0, 0, 0) = 0
所以数字答案为 "0001",即 1。
1 <= num1, num2, num3 <= 9999
本题要求我们对三个正整数进行逐位比较,取每个位上的最小值,最终组合成一个新的四位数。需要注意以下几点:
提取每位数字:
逐位取最小值:
组合结果:
以下是基于上述思路的 Python 实现:
class Solution:
def generateKey(self, num1: int, num2: int, num3: int) -> int:
res = 0
multiplier = 1
for _ in range(4): # 处理四位
digit1 = (num1 // multiplier) % 10
digit2 = (num2 // multiplier) % 10
digit3 = (num3 // multiplier) % 10
min_digit = min(digit1, digit2, digit3)
res += min_digit * multiplier
multiplier *= 10
return res
初始化:
res
用于存储最终结果,初始值为 0
。multiplier
用于确定当前处理的是哪一位(个位、十位、百位、千位),初始值为 1
(个位)。循环处理四位:
for _ in range(4)
来处理四位数字。digit1
、digit2
、digit3
分别提取 num1
、num2
、num3
当前位上的数字:
(num // multiplier) % 10
的操作可以提取出当前位上的数字。例如,对于 num = 1234
,当 multiplier = 10
时,(1234 // 10) % 10 = 3
。min_digit
计算三个数字当前位上的最小值。min_digit
乘以 multiplier
加到 res
上,以构建最终的结果。multiplier
每次循环后乘以 10
,以处理下一位。返回结果:
res
就是根据规则生成的数字答案。让我们通过示例来验证代码的正确性。
输入:num1 = 1, num2 = 10, num3 = 1000
输出:0
步骤:
补零后:
num1 = 0001
num2 = 0010
num3 = 1000
逐位取最小值:
组合结果:0000
,即 0
代码执行:
solution = Solution()
print(solution.generateKey(1, 10, 1000)) # 输出:0
输入:num1 = 987, num2 = 879, num3 = 798
输出:777
步骤:
补零后:
num1 = 0987
num2 = 0879
num3 = 0798
逐位取最小值:
组合结果:0777
,即 777
代码执行:
print(solution.generateKey(987, 879, 798)) # 输出:777
输入:num1 = 1, num2 = 2, num3 = 3
输出:1
步骤:
补零后:
num1 = 0001
num2 = 0002
num3 = 0003
逐位取最小值:
组合结果:0001
,即 1
代码执行:
print(solution.generateKey(1, 2, 3)) # 输出:1