青训营X豆包MarsCode 技术训练营第一课45 题 | 豆包MarsCode AI刷题

77 阅读3分钟

解题思路

问题理解

题目要求我们将一个包含正整数的数组中的所有数字通过逐步删除每一位数字的方式变为0,并计算最少需要的步数。每次删除操作可以选择任意一个数字的任意一位进行删除。

数据结构选择

由于我们需要处理的是数组中的每个数字,并且每次操作是对数字的某一位进行删除,因此我们可以考虑使用字符串来表示每个数字,这样便于逐位处理。

算法步骤

  1. 转换为字符串:将数组中的每个数字转换为字符串形式,以便于逐位删除。
  2. 计算总步数:对于每个数字,计算其长度(即位数),因为每一位都需要一次删除操作才能变为0。
  3. 累加步数:将所有数字的位数累加,得到最终的最少步数。

知识总结

字符串操作

  • 字符串转换:在Python中,可以使用str()函数将整数转换为字符串。
  • 字符串长度:使用len()函数可以获取字符串的长度,即字符串中字符的个数。

数组操作

  • 遍历数组:使用for循环可以遍历数组中的每个元素。
  • 累加操作:使用sum()函数可以对一个可迭代对象(如列表)中的元素进行累加。

时间复杂度

  • 时间复杂度分析:该算法的时间复杂度为O(n * m),其中n是数组的长度,m是数组中数字的最大位数。由于每次操作是对单个数字的位数进行计算,因此整体时间复杂度是线性的。

空间复杂度

  • 空间复杂度分析:该算法的空间复杂度为O(1),因为我们只使用了常数级别的额外空间来存储中间结果。

总结

通过将数字转换为字符串并计算其长度,我们可以有效地解决这个问题。这种方法不仅简单直观,而且时间复杂度和空间复杂度都非常高效。在实际编程中,合理选择数据结构和算法是解决问题的关键。

问题理解

我们需要计算将数组中所有数字变为0所需的最少步数。每个数字的每一位都需要一次删除操作。

数据结构选择

使用字符串来表示每个数字,以便于逐位处理。

算法步骤

  1. 转换为字符串:将数组中的每个数字转换为字符串形式。
  2. 计算总步数:对于每个数字,计算其长度(即位数),并累加这些长度。

代码实现

以下是代码的框架,关键步骤用注释标出:

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

    # 初始化总步数为0

    total_steps = 0

    

    # 遍历数组中的每个数字

    for num in a:

        # 将数字转换为字符串

        num_str = str(num)

        

        # 计算字符串的长度(即数字的位数)

        num_length = len(num_str)

        

        # 累加到总步数

        total_steps += num_length

    

    # 返回总步数

    return total_steps

if name == 'main':

    print(solution(5, [10, 13, 22, 100, 30]) == 7)

    print(solution(3, [5, 50, 505]) == 4)

    print(solution(4, [1000, 1, 10, 100]) == 4)

关键步骤解释

  1. 初始化总步数:使用一个变量total_steps来记录总步数,初始值为0。
  2. 遍历数组:使用for循环遍历数组中的每个数字。
  3. 转换为字符串:使用str()函数将数字转换为字符串。
  4. 计算字符串长度:使用len()函数计算字符串的长度,即数字的位数。
  5. 累加步数:将每个数字的位数累加到total_steps中。
  6. 返回结果:最后返回total_steps作为结果。

通过这次的学习和实践,我不仅掌握了中序遍历的实现,还提高了自己在算法和数据结构方面的能力。期待在接下来的训练营中能有更多的收获!