题目解析(二)| 豆包MarsCode AI刷题

128 阅读2分钟

题目解析

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

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

输入输出格式

  • 输入:一个整数 n 和一个数组 a,其中 a[i] 为数组中的第 i 个正整数。
  • 输出:一个整数,表示最少的删除步骤数。

示例

示例1
输入:
n = 5
a = [10, 13, 22, 100, 30]

输出:
7

示例2
输入:
n = 3
a = [5, 50, 505]

输出:
4

示例3
输入:
n = 4
a = [1000, 1, 10, 100]

输出:
4

思路分析

对于每个数字 num,将其变为0的最少步骤数,显然是其位数。例如,数字 103,需要三步删除:逐步删除个位数、十位数、百位数,直到数字变为0。即对于每个数字 num,步骤数为其位数。

因此,总步骤数就是所有数字的位数之和。可以通过将每个数字转换为字符串来计算其位数,或者使用对数方法进行计算。

解题步骤

  1. 对于每个数字 num,计算其位数。可以通过将数字转换为字符串并求字符串长度来实现。
  2. 将所有数字的位数相加,即为最少的删除步骤数。

代码实现

def solution(n: int, a: list) -> int:
    total_steps = 0
    for num in a:
        # 计算当前数字的位数
        num_digits = len(str(num))
        # 累加到总步数
        total_steps += num_digits
    return total_steps

时间复杂度

  • 时间复杂度:O(n),其中 n 是数组 a 的长度。对于每个数字 num,我们需要计算它的位数,使用 str(num) 转换的时间复杂度是 O(d),其中 d 是该数字的位数。由于最大位数通常较小,因此总的时间复杂度是 O(n)
  • 空间复杂度:O(1),我们只使用常数级别的额外空间。

边界情况

  1. 如果数组中有一个数字为1(即最小的正整数),则它只需要1步即可变为0。
  2. 如果数组中有多个重复数字,我们仍然需要针对每个数字单独计算步骤数,最终求和。
  3. 如果数组为空(n = 0),则返回0,因为没有数字需要删除。