题解-最少步数归零问题 | 豆包MarsCode AI刷题

50 阅读2分钟

问题描述

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

例如:对于数字 103,小R可以选择删除第1位数字,将其变为 3;或者删除第2位数字,变为 13,又或者删除第3位数字,将其变为 10。最终目标是将所有数字都删除为0。


测试样例

样例1:

输入:n = 5,a = [10, 13, 22, 100, 30]
输出:7

样例2:

输入:n = 3,a = [5, 50, 505]
输出:4

样例3:

输入:n = 4,a = [1000, 1, 10, 100]
输出:4

通过MarsCode AI进行解题思路分析

问题理解

我们需要将数组中的每个数字逐步减少到0,每次操作可以删除数字中的任意一位。目标是找到将所有数字变为0所需的最少操作次数。

数据结构选择

  • 由于我们需要处理的是数字的每一位,因此将数字转换为字符串形式会更容易操作。

算法步骤

  1. 转换数字为字符串:将每个数字转换为字符串形式,以便逐位处理。
  2. 统计非零位数:对于每个数字,统计其字符串形式中非零位的数量。因为每次操作只能删除一位,所以非零位的数量就是将该数字变为0所需的最少操作次数。
  3. 累加操作次数:将每个数字的操作次数累加,得到最终的总操作次数。

整理解题思路得出以下代码

def min_steps_for_number(num: int) -> int:

    if num == 0:
        return 0
    
    if num < 10:
        return 1
    
    str_num = str(num)
    length = len(str_num)
    

    non_zero_count = sum(1 for digit in str_num if digit != '0')
    
    return non_zero_count

def solution(n: int, a: list) -> int:

    total_steps = 0
    for num in a:
        steps = min_steps_for_number(num)
        total_steps += steps
    
    return total_steps

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