【问题标题】:Numbers between a and b without their permutationsa 和 b 之间没有排列的数字
【发布时间】:2012-02-13 23:44:17
【问题描述】:

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

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

例如 a=120 和 b=400

我想用一条规则打印这些数字之间的数字。 120 的排列是 102,210,201 等。由于我有 120,我想跳过打印 201 或 210。

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

再次只是询问效率提示。

【问题讨论】:

  • 你有关于下限的信息吗?
  • 应该打印222 吗?
  • 感谢您的评论。下限可以是 1 到 10^20-1 之间的任何值。因为上限可以是 1 到 10^20
  • @LightnessRacesinOrbit 只要222 没有被打印出来
  • 如果 x 和 y 是您的数字并且 y 非常高,那么与 (y-x) 相比,您想要跳过的数字的数量很可能非常低。不知道如何提高效率!

标签: c++ performance algorithm


【解决方案1】:

我不确定您是如何处理 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。

【讨论】:

  • 感谢您的回答,但这是一件事。假设您选择了 99 作为下限,选择了 150 作为上限。从 99,100 开始是唯一的,101,102,103,104 等。所以这里不能应用递增规则
  • @rolandbishop 如果数量低于限制,则对其进行置换。
  • 我去看看。感谢您的努力
  • 跳过一个数字,如果它的数字不是按升序排列并且这些数字的先前排列在范围内。对于固定位数,先前的排列应该是恒定的计算时间。
【解决方案2】:

当下限为 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...) 在要求的范围内。

这个序列很容易通过增加一个整数来形成,当有进位时,复制数字而不是进位。示例: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

处理非零下限要复杂得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多