【问题标题】:Algorithm to generate all possible N-digit numbers with whose digits are in increasing order生成所有可能的 N 位数字的算法,其数字按升序排列
【发布时间】:2013-10-23 10:55:02
【问题描述】:

我想要一个算法来生成所有可能的 N 位数字,其数字按升序排列。

例如:如果 N=3,那么可能的数字是:012,123,234,246,567,259,因为:

0

...

2

等等

我该怎么做?

我开发了以下算法,但它只生成数字连续增加的数字,如 123,234,345,456,567 等。因此,大量数字被遗漏。

private static void generate(int start,int n)
{
    if((start+n)>9)
        return;
    else
    {
        for(int i=0;i<n;i++)
            System.out.print(start+i);

        System.out.println();
        generate(start+1,n);
     }
}

【问题讨论】:

  • 尝试将问题分解为一组较小的问题。例如,您需要生成 10 位数字。如果你已经解决了 9 位数字,你能得到你的答案吗? 5位数字呢?

标签: algorithm


【解决方案1】:

尽量保留你最初的想法:

private static void generate(int prefix, int start, int n)
    {
        if (n == 0)
        {
            System.out.print(prefix);
            System.out.println();
        }
        else
        {
            for(int i=start;i<10;i++)
                generate(10*prefix+i, i+1, n-1);
        }
    }

【讨论】:

  • System.out.print(prefix); System.out.println(); 可以只是System.out.println(prefix);
  • @BartoszKP OP 没有提到任何编程语言,所以我假设只是伪代码。
  • @Henrik 抱歉,如果我的编辑过多。但它不是伪代码——它显然是 Java :) 所以我添加了语言指令,这样更容易阅读。
【解决方案2】:

从更具说明性的角度来看,该算法看起来几乎像数学符号(在 Haskell 中):

generate = toInt [[a,b,c] | a <- x, b <- x, c <- x, a < b, b < c]
  where x = [0..9]
        toInt = map (foldl (\n m -> 10*n + m) 0) 

map (foldl (\n m -&gt; 10*n + m) 0) 只是将数字列表转换为整数 还有一种自我记录:在遵守给定约束的同时取三位数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多