# LeetCode 3270. 求出数字答案 —— Python 解题思路与实现
LeetCode 3270. 求出数字答案 —— Python 解题思路与实现
在本篇博客中,我们将详细解析 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
就是根据规则生成的数字答案。
- 最终的
示例验证
让我们通过示例来验证代码的正确性。
示例 1:
输入:num1 = 1, num2 = 10, num3 = 1000
输出:0
步骤:
-
补零后:
num1 = 0001
num2 = 0010
num3 = 1000
-
逐位取最小值:
- 个位:min(1, 0, 0) = 0
- 十位:min(0, 1, 0) = 0
- 百位:min(0, 0, 0) = 0
- 千位:min(0, 0, 1) = 0
-
组合结果:
0000
,即0
代码执行:
solution = Solution()
print(solution.generateKey(1, 10, 1000)) # 输出: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
代码执行:
print(solution.generateKey(987, 879, 798)) # 输出: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
代码执行:
print(solution.generateKey(1, 2, 3)) # 输出:1
复杂度分析
- 时间复杂度:O(1),因为我们只处理固定的四位数字。
- 空间复杂度:O(1),只使用了常数空间。