剑指 Offer 17. 打印从1到最大的n位数

102 阅读2分钟

前言:剑指offer刷题系列

问题1:

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

示例:

输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]

思路:

拿到这个题我首先想的是如何解决n位进制数的问题,只要解决n位进制的问题,就可以解决这个问题了。 函数定义了一个名为printNumbers的方法,接受一个整数n作为参数,返回一个整数列表作为结果。

我首先创建一个空列表,用于存储生成的整数。然后计算10的n次方,作为生成整数的上限,存储在limit变量中,使用一个for循环,从1开始,到limit结束(不包括limit),每次增加1,将当前循环的值添加到列表re中,最后返回列表re作为结果。 时间复杂度:O(n) 空间复杂度:O(n)

基于上述思考,代码如下:

class Solution:
    def printNumbers(self, n: int) -> List[int]:
        re = []
        limit = (10 ** n)
        for i in range(1,limit):
            re.append(i)
        return re

执行结果如下图:

image-20230906200450199.png

学到的知识点:

学会使用Python的幂运算符来计算一个数的任意次方。

复习了一下使用append函数向列表中添加函数。

问题2:

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例:

输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]

思路:

题目只需要找出其中最小的k个数,我首先想的是将list数组arr排序,然后输出前面k个值就行。

将arr数组用sort函数排序一下,arr数组中的值就按从小到大的顺序排列好了,然后输出排好序的arr数组中的前k个值。

时间复杂度:O(nlog⁡n)

空间复杂度:O(log⁡n)

基于上述思考,代码如下:

class Solution:
    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        arr.sort()
        return arr[:k]

执行结果如下图:

image-20230908145601444.png

这道题的思想特别简单,就是排序一下,其实也可以自己实现一个排序算法,可以冒泡排序走一个哈哈哈。