题目解析
题目描述
小R拿到了一个长度为 n 的数组,其中每个元素都是一个正整数。小R发现每次可以删除某个数组中某个数字的一位数字,通过这种操作,可以逐步将所有数字变为0。小R想知道,为了将数组中所有数字都变为0,最少需要多少步?
例如,对于数字 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,步骤数为其位数。
因此,总步骤数就是所有数字的位数之和。可以通过将每个数字转换为字符串来计算其位数,或者使用对数方法进行计算。
解题步骤
- 对于每个数字
num,计算其位数。可以通过将数字转换为字符串并求字符串长度来实现。 - 将所有数字的位数相加,即为最少的删除步骤数。
代码实现
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步即可变为0。
- 如果数组中有多个重复数字,我们仍然需要针对每个数字单独计算步骤数,最终求和。
- 如果数组为空(
n = 0),则返回0,因为没有数字需要删除。