ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 给定一个整数数组[x0 x1 x2],如何计算从[0 0 0]到[x0 x1 x2]的所有可能排列?

2019-06-21 23:47:52  阅读:150  来源: 互联网

标签:java integer arraylist permutation list


我正在编写一个接收ArrayList的程序,我需要计算从零列表开始的所有可能的排列,直到相应输入列表中的值.

有谁知道如何迭代计算这些值?

例如,给定[1 2]作为输入,它应该找到并存储以下列表:

[0 0],
[1 0],
[1 1],
[1 2],
[0 1],
[0 2]

谢谢!

解决方法:

这是一个标准的递归生成器:

import java.util.Arrays;

//...

static void generate(int... limits) {
    generate(new int[limits.length], limits, 0);
}
static void generate(int[] arr, int[] limits, int n) {
    if (n == limits.length) {
        System.out.println(Arrays.toString(arr));
    } else {
        for (int i = 0; i <= limits[n]; i++) {
            arr[n] = i;
            generate(arr, limits, n + 1);
        }
    }
}

//....

generate(1, 2);
/* prints
[0, 0]
[0, 1]
[0, 2]
[1, 0]
[1, 1]
[1, 2]
*/

这与您编写可变数量的嵌套循环的方式相同.使用递归,您只需编写一个循环,它实际上可以具有变量嵌套深度(如果您不小心,则无限!).

还有迭代即非递归版本:

static void generateI(int... limits) {
    int[] arr = new int[limits.length];
    int n;
    do {
        System.out.println(Arrays.toString(arr));
        n = limits.length - 1;
        while (n >= 0 && arr[n] == limits[n]) {
            arr[n] = 0;
            n--;
        }
        if (n >= 0) arr[n]++;
    } while (n >= 0);
}

除了每个位置都有自己的限制之外,这与以二进制算术(或任何基数,实际)的增量1工作的方式大致相同.

例如,在基数10中,这是你增加的方式:

 12399
     ^ (is highest digit, therefore set to 0, move left)

 12390
    ^ (is highest digit, therefore set to 0, move left)

 12400
   ^ (not the highest digit, add 1, DONE!)

标签:java,integer,arraylist,permutation,list
来源: https://codeday.me/bug/20190621/1258629.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有