AI 刷题 45.最小步数归零问题 题解 | 豆包MarsCode AI刷题

48 阅读3分钟

问题描述

小R拿到了一个长度为 n 的数组,其中每个元素都是一个正整数。小R发现每次可以删除某个数组中某个数的一位数字,这样可以逐步将所有数字变为0。他想知道,要将数组中所有数字都变为0,最少需要多少步?

关键点分析

  1. 删除数字的一位

    • 每次操作可以删除一个数字的一位。例如,对于数字 103,可以选择删除第1位数字,将其变为 3;或者删除第2位数字,变为 13,又或者删除第3位数字,将其变为 10
    • 最终目标是将所有数字都删除为0。
  2. 最少步数

    • 每个数字的位数决定了需要删除的步数。例如,数字 103 有3位,因此需要3步才能将其变为0。
    • 最终答案是所有数字的位数之和。

解题思路

  1. 理解问题

    • 我们需要计算将数组中所有数字变为0所需的最少步数。
    • 每一步可以删除一个数字的一位,因此每个数字的位数就是需要删除的步数。
    • 最终答案是所有数字的位数之和。
  2. 数据结构选择

    • 使用列表来存储数组中的数字。
    • 使用整数变量来累加每个数字的位数。
  3. 算法步骤

    • 遍历数组中的每个数字。
    • 将每个数字转换为字符串,计算其长度(即位数)。
    • 累加每个数字的位数。
    • 返回累加的结果作为最终答案。
def solution(n: int, a: list) -> int:
    total_digits = 0
    
    for num in a:
        # 将数字转换为字符串,计算其长度(即位数)
        num_str = str(num)
        total_digits += len(num_str)

    return total_digits

if __name__ == '__main__':
    print(solution(5, [10, 13, 22, 100, 30]) == 7)
    print(solution(3, [5, 50, 505]) == 4)
    print(solution(4, [1000, 1, 10, 100]) == 4)

代码解释

  1. 函数定义

    • solution(n: int, a: list) -> int:定义一个函数 solution,接受两个参数:n 表示数组的长度,a 表示数组。
    • total_digits = 0:初始化一个变量 total_digits,用于累加每个数字的位数。
  2. 遍历数组

    • for num in a::遍历数组 a 中的每个数字 num
    • num_str = str(num):将数字 num 转换为字符串 num_str
    • total_digits += len(num_str):计算字符串 num_str 的长度(即位数),并累加到 total_digits 中。
  3. 返回结果

    • return total_digits:返回累加的结果 total_digits,即所有数字的位数之和。
  4. 测试代码

    • if __name__ == '__main__'::确保测试代码只在直接运行脚本时执行。
    • print(solution(5, [10, 13, 22, 100, 30]) == 7):测试第一个样例,预期输出为 7
    • print(solution(3, [5, 50, 505]) == 4):测试第二个样例,预期输出为 4
    • print(solution(4, [1000, 1, 10, 100]) == 4):测试第三个样例,预期输出为 4

总结

  • 问题理解:理解题目要求,明确每一步的操作。
  • 数据结构选择:选择合适的数据结构来存储和处理数据。
  • 算法设计:设计合理的算法步骤,确保每一步都能正确实现。
  • 代码实现:编写简洁、高效的代码,确保逻辑清晰、易于理解。
  • 测试验证:通过测试样例验证代码的正确性,确保输出符合预期。

通过以上分析,我们可以明确问题的核心,并设计出合理的算法来解决这个问题。