最少步数归零问题 | 豆包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
,假设列表 a
有 个元素,因此外层循环会执行 次。内层循环 for c in ns
对于每个数字 num
,首先将其转换为字符串 ns
。假设 num
的位数(即数字 num
的长度)为 k,那么 str(num)
的时间复杂度为 。接下来,我们对字符串 ns
中的每个字符 c
进行迭代,检查字符是否为 '0'
。这一操作的时间复杂度为 ,其中 是该数字的位数。则整体时间复杂度为:
2. 空间复杂度分析
我们将数字 num
转换为字符串 ns
,字符串 ns
的长度为数字 num
的位数 。这会占用 的空间。但是,该字符串是每次迭代时都会重新创建的,因此不会增加额外的空间需求。仅仅是对当前数字的字符串表示占用空间。除了存储变量 ans
和一些局部变量之外,我们没有额外的存储需求。因此空间复杂度为: (不包括输入数组本身占用的空间)。
总结:
- 时间复杂度:,其中 是列表
a
的长度, 是每个数字的平均位数。 - 空间复杂度:,因为我们只使用了少量的常数空间。