报数

标签: 数组 数学

难度: Easy

实现一个十进制数字报数程序,请按照数字从小到大的顺序返回一个整数数列,该数列从数字 1 开始,到最大的正整数 cnt 位数字结束。

示例 1:

输入:cnt = 2
输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99]

Submission

运行时间: 44 ms

内存: 20.2 MB

class Solution:
    def printNumbers(self, n: int) -> List[int]:
        return list(range(1, 10 ** n))

Explain

这道题目要求生成从1到最大的n位数的所有数字。给定一个整数n,这意味着最大的n位数是由n个9组成的数,即10的n次方减1。因此,我们可以简单地使用Python的range函数从1开始直到10的n次方,生成这个数列。

时间复杂度: O(10^n)

空间复杂度: O(10^n)

class Solution:
    def printNumbers(self, n: int) -> List[int]:
        # 使用range函数生成从1到10的n次方的数列(不包括10的n次方)
        return list(range(1, 10 ** n))

Explore

在题解中使用列表而不是迭代器或生成器主要是出于简单和直接访问的考虑。列表允许直接访问其元素,且可以轻松地获取长度、进行索引操作和其他各种列表操作。这在需要一次性访问所有生成的数字时特别有用。相比之下,迭代器或生成器虽然在内存使用上更高效,因为它们是按需生成元素,但它们不允许随机访问且每个元素只能访问一次,这在某些应用场景中可能不够灵活。

当`n`的值非常大时,生成的数字列表将非常庞大,会占用大量内存。为了优化内存使用,可以考虑使用生成器而不是列表。生成器可以实现按需计算,每次只产生一个数字,而不是一次性生成所有数字存储在内存中。这样,算法在任何时候都只消耗生成单个数字所需的内存。此外,若处理的逻辑允许分批处理,也可以考虑分段生成数字,每次只处理一部分数字,这样也能显著降低内存使用。

这种直接生成所有数字的方法主要的局限性包括内存消耗和处理时间。随着`n`的增大,生成的数字数量呈指数级增长,这将导致巨大的内存需求和可能的性能瓶颈。此外,如果应用场景仅需依次处理每个数字,而不需要同时访问所有数字,那么使用列表存储所有数字是不经济的。此方法也不适用于对数据进行流处理或需要即时响应的场景,因为它需要在操作任何数据之前生成完整的数字列表。

在极限情况下,例如当`n`等于0或是负数时,按照当前算法的设计,`10 ** n`将不会生成有效的数字范围。例如,`10 ** 0`等于1,使用`range(1, 1)`将产生一个空列表。对于`n`为负数的情况,`10 ** n`将是一个小于1的小数,这在生成整数序列的上下文中没有意义,并且`range`函数也不支持小数作为参数。因此,这个算法在这种情况下将无法正确运行,建议在实际使用中对输入`n`进行适当的边界检查和处理。