学习笔记:最少步数归零问题
问题背景
小R得到了一个由正整数组成的数组a,长度为n。他的任务是对数组中的每个数字进行操作,通过每次删除数字中的任意一位,使得最终数组中的所有数字都变成0。此过程中的每一步操作被称为“一步”,小R的目标是以最少的步骤完成这一任务。
问题分析
为了理解如何以最少的步骤将数组中的所有数字变为0,我们首先需要明确每一步操作的本质:即从一个非零数字中移除一位(可以是任何一位)。这意味着如果一个数字有k位,那么至少需要k步才能将其变为0,因为每一位都需要单独的操作来移除。
然而,需要注意的是,当数字包含0时,移除0并不改变数字的位数,因此只有当移除的是非零数字时,才会减少数字的位数。基于这一点,我们可以得出结论,对于每一个数字,其变为0所需的最小步骤数等于该数字中非零数字的个数。
解决方案
根据上述分析,我们可以通过遍历数组中的每个数字,并计算每个数字中非零数字的数量来确定总的最少步骤数。具体实现如下:
- 初始化一个变量
ans用于记录总的操作次数,初始值设为0。 - 遍历数组
a中的每个元素i:- 使用循环检查当前数字
i是否不为0。 - 在循环内部,使用
pos = i % 10获取当前数字的最后一位。 - 如果
pos不为0,则说明这是一位有效的非零数字,增加ans的值。 - 通过
i //= 10去除当前数字的最后一位,继续检查剩余部分。
- 使用循环检查当前数字
- 循环结束后,返回
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是数组中所有数字的总位数,这是一个非常高效的解决方案。