a和b之间的数字没有它们的排列

时间:2012-02-13 23:44:18

标签: c++ performance algorithm

我写过一个类似的问题已经结束我想问不是代码而是效率提示。我没有编码,但如果我在这里找不到任何好的提示,我会去编码直截了当。我的问题:

假设您有一个函数listNums,它将 a 作为下限, b 作为上限。

例如a = 120且b = 400

我想用一条规则在这些数字之间打印数字。 120的排列是102,210,201等。因为我有120,所以我想跳过201或210的印刷。

原因:上限可以达到10 20 ,减少排列将有助于运行时间。

再次询问效率提示。

2 个答案:

答案 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

处理非零下限更加棘手。