【问题标题】:Unable to generate sub-sets of an array无法生成数组的子集
【发布时间】:2022-03-04 18:40:45
【问题描述】:

我正在尝试查找数组的子集。例如,如果数组是 [1,2] 我正在尝试打印以下内容:

[1][2]
[1]
[2]
null

我写的代码如下:

    import java.util.*;

      class PrintArray {
           public static void printme(int a[], int pos, int size) {
              if (pos >= size)
               return;
           else
            System.out.println(a[pos]);
        pos++;
        printme(a, pos, size);
    }

    public static void generate(int a[], ArrayList<Integer> list, int pos, int size) {

        if (pos > size) {
            for (int i = 0; i < list.size() - 1; i++) {
                System.out.print("[" + list.get(i) + "]");
            }
            System.out.println();
            return;
        }

        list.add(a[pos]);
        generate(a, list, pos + 1, size);
        list.remove(list.size() - 1);
        generate(a, list, pos + 1, size);

    }

    public static void main(String args[]) {
        int ar[] = { 1, 2, 3, 4, 5 };
        // printme(ar, 0, ar.length);
        ArrayList<Integer> list = new ArrayList<Integer>();
        generate(ar, list, 0, ar.length);

    }
}

但是我遇到了以下 OOBE 错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds 

这可以通过检查 pos>=size 而不是 pos>size 来解决,但这样的更改不会生成所有子数组。

后续问题是我得到了重复的输出,如下所示:

[2][3][4]
[2][3]
[2][3]
[2]
[2][4]
[2]
[2]

有人可以帮我解决这两个问题吗?

【问题讨论】:

标签: java sub-array


【解决方案1】:

您可以将您的子集数组视为一个矩阵。对于 {x, y} 数组:

  • 矩阵将有 2^n 个元素,其中 n 是数组中的元素数;
  • 可以用二进制显示,1 表示打印元素,0 不打印任何内容:

public static void main (String[] args) throws Exception
    {
        int ar[] = {1, 2};
        int nrOfSubsets = (int) Math.pow (2, ar.length); 

        // prints the subset matrix
        for (int i = nrOfSubsets - 1; i >= 0; i--)
        {
            String output = "";
            int temp = i;

            // prints one matrix line
            for (int j = ar.length - 1; j >= 0; --j)
            {
                 // convert to binary, 1 means print the number
                 int rem = temp % 2;
                 temp = temp / 2;
                 if (rem == 1)
                 {
                     output = "[" + ar[j] + "]" + output;
                 }
             }
            if(output.isEmpty()) output = "null";
            System.out.println (output);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 2015-06-24
    • 2018-10-20
    • 2021-03-16
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2017-08-14
    相关资源
    最近更新 更多