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