我写过一个类似的问题已经结束我想问不是代码而是效率提示。我没有编码,但如果我在这里找不到任何好的提示,我会去编码直截了当。我的问题:
假设您有一个函数listNums,它将 a 作为下限, b 作为上限。
例如a = 120且b = 400
我想用一条规则在这些数字之间打印数字。 120的排列是102,210,201等。因为我有120,所以我想跳过201或210的印刷。
原因:上限可以达到10 20 ,减少排列将有助于运行时间。
再次询问效率提示。
答案 0 :(得分:4)
我不确定你是如何处理0的(例如:输出1后你跳过10,100等,因为技术上1 = 01 = 001 ..)。
诀窍是选择一个数字,使其所有数字的数字递增(从左到右)。
你可以递归地做。在每次递归时添加一个数字并确保它等于或高于您最近添加的数字。
编辑:如果生成的数字小于下限,则以大于或等于下限的方式对其进行置换。如果A1A2A3..Ak是你的号码并且它低于限制),则逐步检查A2A1A3 ... Ak,A3A1A2 ... Ak,...,AkA1A2 ... Ak-1是否在限制范围内。如果需要,重复此步骤,将Ak保持为第一位,并找到A1A2..Ak-1的组合。
例如:假设我们选择3位数,下限为99.如果组合为012,则高于99的最低排列为102.
答案 1 :(得分:0)
当下限为0时,答案由具有非递减数字的数字组给出(0,1,2,3,4,5,6,7,8,9,11,12,13 ,14,15,16,17,18,19,22,23,24,25,26,27,28,29,33,34,35,36,37,38,39,44,45,46,47 ,48,49,55,56,57,58,59,66,67,68,69,77,78,79,88,89,99,111,112 ......)落在要求的范围内。< / p>
这个序列很容易通过递增一个整数来形成,当有一个进位时,复制数字而不是携带。例如:73之后是73 + 1 = 74(无携带); 79之后是79 + 1 = 80(随身携带),所以反而是88; 22356999之后是22356999 + 1 = 22357000,因此为22357777。
# Python code
A= 0 # CAUTION: this version only works for A == 0 !
B= 1000
N= A
while N < B:
# Detect zeroes at the end
S= str(N)
P= S.find('0')
if P > 0:
# Replicate the last nonzero digit
S= S[:P] + ((len(S) - P) * S[P-1])
N= eval(S)
# Next candidate
print N
N+= 1
处理非零下限更加棘手。