java - 使用数组中的第一个 'n' 整数递归打印所有子集

标签 java

使用数组的前 n 个整数递归地打印可能的子集。 示例:int[] X = [1, 2, 3, 4],如果 n = 3,则打印 [3, 2, 23, 1, 13, 12, 123]

我已经坐在这里几个小时了,我盲目地尝试过,现在向你们寻求帮助!这是我到目前为止所拥有的。它离答案还很远,所以请耐心等待。

static void subsets(int[] A, int n){
    subsets("", A, n);
}
private static void subsets(String S, int[] A, int n){
    if(n == 0){
        System.out.println(S);
    } else {
        for (int i = n-1; i >= 0; i--) {
            subsets(A[n-i-1]+S, A, n-i);
        }
    }
}

最佳答案

解决这个子集问题的方法有很多,但我特别喜欢下面的方法。

它依赖于这样一个事实:当您以二进制形式从 1 数到 N(N 是 2 的幂)时,这些位会包含所有可能的唯一组合。因此,如果您将每个位“附加”到数组中的特定值,您将获得值的所有可能组合。

在您的示例中,您在数组中采用 N = 3 个值。用N位,可以得到2^3 (或 1<<3 )= 8 个不同的值。因此,让我们用二进制数从 0 到 7,并观察每一步打开或关闭的位:

  • 1 = 001 -> 仅获取列表中的第一项
  • 2 = 010 -> 仅选取列表中的第二项
  • 3 = 011 -> ...
  • 4 = 100
  • 5 = 101 -> 获取列表中的第一个和第三个元素
  • 6 = 110
  • 7 = 111

现在你已经找到了 N 个元素中所有可能的子集。

这是代码:

int[] nums = new int[]{1, 2, 3, 4};
int n = 3;

int maxValueOnNBits = 1 << n;

for (int i = 1; i <= maxValueOnNBits; i++) {
    for (int bit = 0; bit < n; bit++) {
        int mask = 1 << bit;
        if ((i & mask) == mask) System.out.print(nums[bit]);
    }
    System.out.println();
}

关于java - 使用数组中的第一个 'n' 整数递归打印所有子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49544445/

相关文章:

java - 正则表达式替换后格式错误的 xml

java - 为什么 Selenium WebDriver 不会切换到我的新选项卡(Excel 报告)

Java:从字节数组中删除第一个UTF字符串

java - 是否有用于 Bitly API 的 Java 库?

java - 从 Makefile 检测 Java 位置

java - 为什么 Java 整数字面量的默认类型是 int 而不是 long?

java - 将变量传递给来自外部 Controller 的 POST 请求

java - 为什么添加final方法修饰符会降低代码效率?

java - 类路径问题

java - 如何根据给定的 DTD 文件验证 XML 文件?