leetcode 第386題 字典序排數 python解法

leetcode 第386題 字典序排數 python解法

問題分析

先看題目:在這裏插入圖片描述
題目要求將整數按照字典序排序,一看到這個我先想到了字符串是按照字典序排序的。所以,先想的方法是先將所有的整數存到數組,然後全部轉爲字符串。接着對字符串數組進行排序,最後將字符串轉爲整形數組。這種方法思路很簡單,而且容易寫。但是這裏用到了字符串的排序,所以有點投機取巧。另外,該方法的時間複雜度大於O(n)。
另一種方法是參考了別人的答案。
首先生成一個大小爲n的列表,並全部賦值爲0。接下來就只要將從1~n共n個數逐個填到數組中。現在的問題就是如何在每個位置上填上合適的數。
有一點是可以確定的,那就是第一個位置(如果存在的話)上一定是1。接下來做的就是根據當前的數推測出下一個位置上的數。而下一個位置的數有三種情況:1,當前的數乘上10;2,當前的數加上1;3,判斷當前的數整除10後是否等於9,如果等於9,繼續整除10,最後加上1。如果當前的數爲n,那麼直接執行第三項。 這三種方法依次判斷,首先將數乘上10,這樣就是在當前的數後面加一個0(即1後面緊接爲10,100, 1000),這樣的數是最接近當前的數。如果乘上10大於n時,馬上就進行第二個條件,即每個數加一。加一是將最後一位上的數加一如(1001, 1002,···, 1009),這時的數是最接近當前數的。如果最後末位加到了9,最後進行第三個條件。將當前的數整除10,如果最後一位等於九,接着整除(如1999,整除10爲19,得接着整除10,最後得到1,末尾不爲9,接着加1, 爲2)。這樣就從首位爲1到了首位爲2。
按照上面的三種方法,可以逐漸將n個數逐漸填到數組中。

源碼

class Solution:
    def lexicalOrder(self, n):
        """
        :type n: int
        :rtype: List[int]
        """
        # 投機取巧,用字符串
        # return [int(i) for i in sorted([str(i) for i in range(1, n+1, 1)])]

        # 這種方法比較好
        ret = [0] * n
        num = 1
        for i in range(n):
            ret[i] = num
            # 計算下一個位置的num
            if num * 10 <= n:
                num *= 10
            else:
                while num % 10 == 9 or num == n:
                    num = num // 10
                num += 1
        return ret

謝謝大家

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章