【问题标题】:Compute all possible numbers from given digits从给定的数字计算所有可能的数字
【发布时间】:2013-03-21 23:16:33
【问题描述】:

问题很简单。从给定的一组数字(最多 10 位数字)中,计算可以从这些数字中生成的所有数字(一个数字可以使用多次)。

拳头我想使用蛮力并遍历所有可能的组合,但是组合的数量与 N 的阶乘一样大,其中 N 是位数。即使有可能,我如何在不使用 10 个 for 循环的情况下运行所有​​可能的组合?

其次,我尝试将所有这些数字放在一个字符串中,然后从字符串中删除一个并放在末尾并继续这样尝试,但这可能不会给出任何可能的组合,即使它确实如此,我也没有'不相信会在合理的时间内完成。

我确信必须有一种更快更好的算法来从给定的一组数字中获取所有可能的数字。

我在互联网上找到了一个代码,它是:

#include <iostream>
#include <algorithm>
using namespace std;
int main () {
    int noOfDigits;
    cin >> noOfDigits;
  int myints[noOfDigits];
  for(int i = 0; i<noOfDigits; i++)
  {
      cin >> myints[i];
  }

  sort (myints,myints+3);
  do {
        for(int i = 0; i<noOfDigits;i++)
        {
            cout << myints[i];
        }
        cout << endl;
  } while ( next_permutation(myints,myints+noOfDigits) );
  return 0;
}

【问题讨论】:

  • 你可以把同一个数字放在不同的位置吗?例如,给定 {1,2},你能做 11, 12,22,21 吗?我的意思是允许多次选择同一个数字吗?
  • @SongWang 我猜它是否包含在您的案例中 twise {1,1,2,2}。
  • @Stefan4024 您需要多种组合吗?或者实际上是组合?
  • 不,对于 {1,2},您应该打印或放入向量中只有 12 和 21。我想我已经在问题中说明了这一点

标签: c++ algorithm permutation digits


【解决方案1】:

我的方法可能看起来有点复杂,但我会先给出一个概述和一些非常简单的示例代码(来自错误的语言)。

正如您所说,您从根本上想要元素的所有排列。因此,显而易见的方法是使用已经执行此操作的库函数。可能是std::next_permutation(我将使用intertools.permutations 作为我的简单示例)。但是,您指定您的输入集中可能有重复的元素,这违反了对该工具的约束。

所以我的方法是在一组唯一键和我们的元素(数字)及其可能的重复项之间建立一个映射。对于您描述的少量数字,最简单的方法是使用单个字符作为键,将它们(当然是通过字典)映射到给定的元素(数字)。一个方便的方法是通过string.printable。因此,给定一个名为 mydigits 的元组、列表或其他“数字”序列,我们可以将映射构建为:

#!python
import string
digit_mapping = dict([(y,x) for x,y in zip(mydigits,string.printable)])

从那里我们所要做的就是遍历排列并将键映射回它们的原始“数字”(在这种情况下,这些“数字”的字符串表示形式

#!python
for i in itertools.permutations(digit_mapping.keys()):
    perm = ''.join([str(digit_mapping[x]) for x in i])
    print perm,

...当然,如果您想以某种特定顺序而不是按 .keys() 方法和 中的任何顺序打印这些排列,您可能需要稍微改变一下itertools.permutations() 函数可以。 (这些是实现细节)。

那么,您能否创建这样的映射,迭代其键的排列,并在返回/打印结果时执行映射取消引用?

【讨论】:

  • 标签表明我们在这里处理的是一个 C++ 特定的问题。使用 python 库可能不是一种选择。
  • 哎呀。没有注意到这是一个 C++ 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多