当前位置: 首页 > article >正文

# LeetCode 3270. 求出数字答案 —— Python 解题思路与实现

LeetCode 3270. 求出数字答案 —— Python 解题思路与实现

在本篇博客中,我们将详细解析 LeetCode 上的第 3270 题——求出数字答案。我们将从问题描述出发,逐步分析解题思路,最后提供 Python 代码实现,并通过示例验证其正确性。

问题描述

给你三个 正整数 num1num2num3。数字 num1num2num3数字答案 key 是一个四位数,定义如下:

  1. 前导补零:如果有数字少于四位数,给它补前导零。例如,数字 1 补零后为 "0001"
  2. 逐位取最小值:答案 key 的第 i 个数位(1 <= i <= 4)为 num1num2num3i 个数位中的 最小值
  3. 去除前导零:返回的 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

解题思路

本题要求我们对三个正整数进行逐位比较,取每个位上的最小值,最终组合成一个新的四位数。需要注意以下几点:

  1. 补零处理:由于输入的数字可能不足四位,需要在前面补零,以确保每个数字都是四位数。
  2. 逐位取最小值:分别取个位、十位、百位和千位上的最小值。
  3. 组合结果:将四个最小值按照千位到个位组合成一个新的数字,去除前导零。

实现步骤

  1. 提取每位数字

    • 对于每个数字,提取千位、百位、十位和个位的数字。可以使用整除和取余操作来实现。
  2. 逐位取最小值

    • 对应位置的三个数字取最小值。
  3. 组合结果

    • 将四个最小值按照千位到个位的位置组合起来,形成最终的结果。

代码实现

以下是基于上述思路的 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

代码解析

  1. 初始化

    • res 用于存储最终结果,初始值为 0
    • multiplier 用于确定当前处理的是哪一位(个位、十位、百位、千位),初始值为 1(个位)。
  2. 循环处理四位

    • 使用 for _ in range(4) 来处理四位数字。
    • digit1digit2digit3 分别提取 num1num2num3 当前位上的数字:
      • (num // multiplier) % 10 的操作可以提取出当前位上的数字。例如,对于 num = 1234,当 multiplier = 10 时,(1234 // 10) % 10 = 3
    • min_digit 计算三个数字当前位上的最小值。
    • min_digit 乘以 multiplier 加到 res 上,以构建最终的结果。
    • multiplier 每次循环后乘以 10,以处理下一位。
  3. 返回结果

    • 最终的 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),只使用了常数空间。

http://www.kler.cn/a/499934.html

相关文章:

  • 实用操作系统学习笔记
  • Spring Boot + Jasypt 实现application.yml 属性加密的快速示例
  • 【25考研】川大计算机复试情况,重点是啥?怎么准备?
  • 重新面试之JVM
  • 不同方式获取音频时长 - python 实现
  • Selenium python爬虫 是否需要设置浏览器窗口大小 ,有些按钮显示 不全会导致无法正常与这些元素进行交互
  • webpack03
  • 数据结构初阶---排序
  • 【机器学习篇】 科技异次元的超强 “魔杖”,开启奇幻新程
  • 金融项目实战 01|功能测试分析与设计
  • c++ 预备
  • 计算机基础知识复习1.5
  • cmake 编译ffmpeg的Android 的 so文件的cmake内容
  • 深度解析:语言模型的推理能力与强化学习优化
  • 人工智能与物联网:智慧城市的未来
  • 25/1/11 嵌入式笔记<esp32> 初入esp32
  • C语言二级考试
  • “负载均衡”出站的功能、原理与场景案例
  • 投机解码论文阅读:Falcon
  • C#语言的语法糖
  • 【算法与数据结构】—— 回文问题