【LeetCode】386. 字典序排数

200 阅读2分钟

image.png

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

    • 本题只有一个参数十进制n,范围在1~5 * 10^4
    • 需要实现时间复杂度O(n),空间复杂度O(1)

二、思路分析:

我们拿到本题,一看题目寥寥几个字就介绍完,还没有明白字典序是什么?

打开网上的浏览器,去了解一番字典序:

  • 排序按照字典顺序来进行排序的,第一个字母排完,再第二个字母排,以此类推

选取本题的示例n=32时,先排第一位数字的结果,再排个位的。

image.png

本题给出的是一个十进制的数字,要求数字进行字典排序,时间复杂为O(N)

  • 方法一: 迭代法

大家有没有记得之前我们做的进制的问题考察都是逆向思维,取每低位的数字。

本题,我们要换一种思路,通过迭代方式取高位的数字。

  • 首先定义一个长度为 n 的初始化列表,用于存储排序结果
  • 题目要求从1到n进行排序,所以cur初始值设置为1
  • 使用for循环遍历数值n范围内值
  • 对cur10进行判断小于n时,则cur被赋值为cur10,进入整数序列排序
  • 当cur*10大于n,则需要判断cur mod 10 是为9,或者cur + 1 大于 n,则说明需要进入下一个整数序列,cur = cur / 10,然后进行cur = cur +1
  • 否则cur 进行加1

以上方法,需要对下一个整数序列进行处理,使用python实现代码如下:

class Solution(object):
    def lexicalOrder(self, n):
        """
        :type n: int
        :rtype: List[int]
        """

        ans = []
        cur = 1

        for i in range(n):
            ans.append(cur)
            if cur *10 <=n:
                cur = cur *10
            else:
                while cur % 10 == 9 or cur +1 >n:
                    cur = cur / 10
                cur = cur +1

        return ans
  • 方法二:sort排序

  • 在python中只需要sorted()与list()结合

  • python魔力之处,可以一行代码解决

return sorted(list(range(1,n+1)),key=str)

三、总结:

本期我们了解了字典序排序,解答该题使用迭代方法,AC记录如下:

image.png

时间复杂度O(n),n是整数n范围 空间复杂度O(1)

以上是本期内容,欢迎大佬们点赞评论,下期见~~~