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

117 阅读2分钟

学习笔记:最少步数归零问题

问题背景

小R得到了一个由正整数组成的数组a,长度为n。他的任务是对数组中的每个数字进行操作,通过每次删除数字中的任意一位,使得最终数组中的所有数字都变成0。此过程中的每一步操作被称为“一步”,小R的目标是以最少的步骤完成这一任务。

问题分析

为了理解如何以最少的步骤将数组中的所有数字变为0,我们首先需要明确每一步操作的本质:即从一个非零数字中移除一位(可以是任何一位)。这意味着如果一个数字有k位,那么至少需要k步才能将其变为0,因为每一位都需要单独的操作来移除。

然而,需要注意的是,当数字包含0时,移除0并不改变数字的位数,因此只有当移除的是非零数字时,才会减少数字的位数。基于这一点,我们可以得出结论,对于每一个数字,其变为0所需的最小步骤数等于该数字中非零数字的个数。

解决方案

根据上述分析,我们可以通过遍历数组中的每个数字,并计算每个数字中非零数字的数量来确定总的最少步骤数。具体实现如下:

  1. 初始化一个变量ans用于记录总的操作次数,初始值设为0。
  2. 遍历数组a中的每个元素i
    • 使用循环检查当前数字i是否不为0。
    • 在循环内部,使用pos = i % 10获取当前数字的最后一位。
    • 如果pos不为0,则说明这是一位有效的非零数字,增加ans的值。
    • 通过i //= 10去除当前数字的最后一位,继续检查剩余部分。
  3. 循环结束后,返回ans作为结果。

代码实现

def solution(n: int, a: list) -> int:
    ans = 0
    for i in a:
        while i != 0:
            pos = i % 10
            if pos != 0:
                ans += 1
            i //= 10
    return ans

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个非零数字

总结

这个问题的关键在于理解每个数字的非零位数决定了将该数字变为0所需的最小操作次数。通过逐位检查每个数字并统计非零数字的数量,我们可以高效地解决这个问题。此方法的时间复杂度为O(d),其中d是数组中所有数字的总位数,这是一个非常高效的解决方案。