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 算法分析和思路 min_steps_for_number(num: int) -> int 函数 这个函数的目标是计算将一个整数归零所需的最少步数。步骤如下: 处理特殊情况: 如果数字是0,不需要任何步数,直接返回0。 如果数字是个位数(小于10),那么只需要一步就可以归零,返回1。 计算非零数字的个数: 将数字转换为字符串,以便逐位处理。 遍历字符串中的每一位,计算非零数字的个数。 返回非零数字的个数,因为每删除一个非零数字(例如通过减法操作)可以认为是一步。 solution(n: int, a: list) -> int 函数 这个函数的目标是计算一个整数数组中所有数字归零所需的最少步数的总和。步骤如下: 初始化总步数: 初始化一个变量 total_steps 为0,用于存储所有数字归零所需的总步数。 遍历数组: 对于数组中的每个数字,调用 min_steps_for_number 函数计算其归零所需的最少步数。 将计算得到的步数累加到 total_steps 中。 返回结果: 遍历完成后,返回 total_steps,即所有数字归零所需的最少步数的总和。 复杂度分析 时间复杂度: min_steps_for_number 函数的时间复杂度是 O(d),其中 d 是数字的位数。因为我们需要遍历数字的每一位来计算非零数字的个数。 solution 函数的时间复杂度是 O(n * d),其中 n 是数组的长度,d 是数组中数字的平均位数。因为我们需要对每个数字调用 min_steps_for_number 函数。 空间复杂度: min_steps_for_number 函数的空间复杂度是 O(1),因为它只使用了固定数量的额外空间。 solution 函数的空间复杂度也是 O(1),因为它只使用了固定数量的额外空间(不考虑输入数组本身所占用的空间)。