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

9 阅读3分钟

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

问题描述

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

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

思路

本题中,值非0的位一定需要消耗一次操作来删除,而值为0的位如果是最高位的话可以省去一次操作。那么我们就从前往后删除位,这样可以保证每一次碰到0都在数字的最高位,这时直接跳过到下一个非0位接着执行即可。

代码实现
def solution(n: int, a: list) -> int:
    ans = 0
    for num in a:
        ns = str(num)
        for c in ns:
            if c != '0':
                ans += 1
    return ans

if __name__ == '__main__':
    #test cases...

再观察一下,实际上对于值为0的位我们根本不需要进行操作,那本题实际上就是统计一下数字去掉所有0之后的长度。用python直接把每个数转换成字符串,删除其中的0然后求长度即可。更短的代码:

def solution(n: int, k: int, s: str) -> str:
    return sum(len(str(num).replace('0', '')) for num in a)
复杂度分析

1. 时间复杂度分析

外层循环 for num in a 遍历列表 a 中的每个数字 num,假设列表 ann 个元素,因此外层循环会执行 nn 次。内层循环 for c in ns 对于每个数字 num,首先将其转换为字符串 ns。假设 num 的位数(即数字 num 的长度)为 k,那么 str(num) 的时间复杂度为 O(k)O(k)。接下来,我们对字符串 ns 中的每个字符 c 进行迭代,检查字符是否为 '0'。这一操作的时间复杂度为 O(k)O(k),其中 kk 是该数字的位数。则整体时间复杂度为: O(nK)O(n⋅K)

2. 空间复杂度分析

我们将数字 num 转换为字符串 ns,字符串 ns 的长度为数字 num 的位数 kk。这会占用 O(k)O(k) 的空间。但是,该字符串是每次迭代时都会重新创建的,因此不会增加额外的空间需求。仅仅是对当前数字的字符串表示占用空间。除了存储变量 ans 和一些局部变量之外,我们没有额外的存储需求。因此空间复杂度为: O(1)O(1) (不包括输入数组本身占用的空间)。

总结:

  • 时间复杂度O(nK)O(n⋅K),其中 nn 是列表 a 的长度,KK 是每个数字的平均位数。
  • 空间复杂度O(1)O(1),因为我们只使用了少量的常数空间。