先了解什么是字典顺序 比如201
[1,10,100,101,102,103,104,105,106,107,108,109,11,110,…198,199,2,20,200,201,21,…]
可以用sorted函数 但是时间复杂度会增加
观察整理规律可得
cur为当前数字
1.若cur10<=n 则下个数为cur10 否则
2.如果cur数字末尾不为9并且cur+1不大于n 则cur+=1 否则
3.观察不是2的情况 (i)如果cur=n 可以看到201 下一个数为21 cur=cur//10+1
(ii)如果cur数字末尾为9 109->11 199->2 也就是去cur的末尾数字直到不为9 再 cur=cur//10+1
class Solution:
def lexicalOrder(self, n):
"""
:type n: int
:rtype: List[int]
"""
if n<1:
return []
cur=1
res=[]
for i in range(n):
res.append(cur)
if cur*10<=n:
cur=cur*10
elif cur%10!=9 and cur+1<=n:
cur+=1
else:
while ((cur//10) % 10)==9:
cur=cur//10
cur=cur//10+1
return res

本文深入探讨了字典顺序排列算法的实现细节,通过观察和整理规律,提出了一种高效的方法来生成从1到n的整数列表,确保列表中的整数遵循字典顺序。该算法避免了使用sorted函数所带来的高时间复杂度问题,特别适用于处理大规模数据集。
429

被折叠的 条评论
为什么被折叠?



