【问题标题】:Java - Algorithm - Display all the possibilities of sequence [closed]Java - 算法 - 显示序列的所有可能性 [关闭]
【发布时间】:2020-11-01 07:21:24
【问题描述】:

请帮我找到以下最有效的解决方案。

int max = 2;
int sequenceLength = 3;
List<Integer> sequence = new ArrayList<Integer>(sequenceLength);
List<List<Integer>> possibilitites = new ArrayList<List<Integer>>();
...solution...
System.out.print(possibilitites);

sequenceLength 是每个序列的长度。

序列将包含数字的组合,介于 0 到 Max 之间,即 2。

创建的每个序列,都将被添加到可能性中。

该解决方案应该能够处理任何 max 和 sequenceLength。

预期结果:

(0,0,0),(0,0,1),(0,0,2),(0,1,0),(0,1,1) 等等

【问题讨论】:

  • (max+1) ^ length 的可能性,所以max=2length=3 有27 个。随着length 的增加,这个数字变得非常大。例如,如果 max=1length=32 有 40 亿种可能性。
  • 谢谢你的公式,它有帮助。但我也需要 ArrayList 的可能性。
  • Java 中可能有一个我不知道的内置函数。但是可以通过简单的计数算法来生成可能性。例如。 max=2length=3 有 27 种可能性,因此使用循环从 0 计数到 26,然后将数字分解为以 3 为底的数字。您也可以使用数字数组进行计数。增加最低有效数字。如果结果大于max,则将数字设置为 0,并增加下一个数字。当最重要的数字到达max+1 时,您就完成了。

标签: java algorithm arraylist combinations sequence


【解决方案1】:

@user3386109 在 cmets 中建议的基于循环的序列生成器的简单实现:

    static List<List<Integer>> generate(final int max, final int len) {
        final int limit = max + 1;
        List<List<Integer>> result = new ArrayList<>();
        for (int i = 0, n = (int) Math.pow(limit, len); i < n; i++) {
            List<Integer> list = new ArrayList<>();
            
            int num = i;
            for (int j = 0; j < len; j++) {
                
                list.add(0, num % limit);
                num /= limit;
            }
            result.add(list);
        }
        return result;
    }

其他选项是使用String.format 并转换为具有特定基数的整数 (max + 1):

static List<List<Integer>> generate2(final int max, final int len) {
        final int limit = max + 1;
        return IntStream
                .range(0, (int)Math.pow(limit, len))
                .mapToObj(i -> 
                    String.format("%" + len + "s", Integer.toString(i, limit))
                          .replace(' ', '0')
                          .chars()
                            .map(c -> c - '0')
                            .boxed()
                            .collect(Collectors.toList())
                )
                .collect(Collectors.toList());
                
    }

【讨论】:

  • 我尝试了第一种解决方案,它有效,谢谢
猜你喜欢
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 2021-03-26
相关资源
最近更新 更多