当前位置: 首页 > 知识库问答 >
问题:

Java 计算给定 int 数组的所有可能组合

华泳
2023-03-14

我正在尝试构造一个程序,该程序将获取一个int({1,2,3})数组和一个长度值,并计算该数组的所有可能组合。

例如:

int[] arr= new char[] {0,1};
int[] tes  = new int[3];
possiblecomb(2, arr,tes,0);

这将输出:

 00
 10
 01
 11

但是当我尝试在 for 循环中调用可能的梳子时,我不断收到堆栈溢出错误

 import java.util.Arrays;

 public class Program {

public static void main(String[] args) {

    // Create an arr to work with
    int[] test = new int[] {0,1};
     int[] tes  = new int[3];
    // Find all possible combinations of this arr in the string size of 3
    possiblecomb(3, test,tes,0);
}

public static void possiblecomb(int maxLength, int[] nums, int[] curr,int end) {

    // If the current array has reached it's maximum length
    if(end == maxLength) {
        System.out.println(Arrays.toString(curr));

    // Else add each number from the numbs to new array and process these new arrays again
    } else {
        for(int i = 0; i < nums.length; i++) {
            int[] oldCurr = curr.clone();
            curr[end]= nums[i];
            possiblecomb(maxLength,nums,curr,end++);
            curr = oldCurr.clone();
        }
    }
}

}

共有2个答案

王昊
2023-03-14

正如@MichaelCMS所说,你永远不会停止递归,因此会出现堆栈溢出。

如果您不介意使用List而不是数组,这是一个解决方案

import java.util.*;

public class Program {
  private static List<List<Integer>> combinations(List<Integer> list, int maxLength) {
    return combinations(list, maxLength, new ArrayList(), new ArrayList());
  }

  private static List<List<Integer>> combinations(List<Integer> list, int length, List<Integer> current, List<List<Integer>> result) {
    if (length == 0) {
      List<List<Integer>> newResult =  new ArrayList<>(result);
      newResult.add(current);
      return newResult;
    }

    List<List<List<Integer>>> res3 = new ArrayList<>();
    for (Integer i : list) {
      List<Integer> newCurrent = new ArrayList<>(current);
      newCurrent.add(i);
      res3.add(combinations(list, length - 1, newCurrent, result));
    }

    List<List<Integer>> res2 = new ArrayList<>();
    for (List<List<Integer>> lst : res3) {
      res2.addAll(lst);
    }
    return res2;
  }

  public static void printCombinations(List<Integer> list, int maxLength) {
    List<List<Integer>> combs = combinations(list, maxLength);
    for (List<Integer> lst : combs) {
      String line = "";
      for (Integer i : lst) {
        line += i;
      }
      System.out.println(line);
    }
  }

  public static void main(String[] args) {
    List<Integer> l = Arrays.asList(0, 1);
    printCombinations(l, 2);
  }
}

这给了你:

00
01
10
11
宗冷勋
2023-03-14

尝试将递归调用移到for之外。

您正在使用for复制内容。

您的最终变量最终将增加到最大长度以上,并且您的(==)比较不会阻止。

例如,num.Length=2,end为2:

您将在 end = 3 的情况下调用您的函数一次,这将在递归调用中停止并打印,接下来,当 i == 1 时,您的结束将是 4,递归调用不会中断。

如果要避免当前代码的无限递归,以便更好地调试输出,请将中断条件

if (end>=maxLength)
 类似资料:
  • 我有一个数字数组,现在我必须通过生成给定数组的所有可能子数组并应用一些条件来找到元素之和。 条件是,对于每个子阵列,获取最小值,并找到其中的元素总数,然后将两者相乘(最小值*总数)。最后,将所有子阵列的所有这些相乘值相加。 以下是问题陈述: 使用下面的公式找到所有可能的子数组的总和: 和(左,右)=(最小的arr[i]) * (∑ arr[i]),其中i的范围从左到右。 例子: 子数组是:[sta

  • 问题内容: 我想找到一组整数的子集。这是具有回溯功能的“子集总和”算法的第一步。我已经编写了以下代码,但是没有返回正确的答案: 例如,如果我要计算set = {1,3,5}的子集,则我的方法的结果是: 我希望它产生: 我认为问题出在零件list.removeAll(list);中。但我不知道如何纠正它。 问题答案: 你想要的就是Powerset。这是一个简单的实现: 我将为你提供一个示例,说明该算

  • 我试图从表示数字的int数组生成所有可能的数字。 例如,我得到以下结果。 例如,arr=new int[]{1,2,3},我得到以下结果。 1 2 3 11 21 31 12 22 32 13 23 33 111 211 311 121 221 321 131 231 331 112 212 312 122 222 322 132 232 332 113 213 313 123 223 323 1

  • 我正在尝试编写一种方法来将数组置换为所有可能的排列。我将每个数组以ArrayList的形式,翻转两个元素,然后将ArrayList返回到ArrayList of ArrayList。如果我在翻转两个元素后将每个数组打印到屏幕上,则按预期进行打印。[1,2,3]前两个元素翻转打印为[2,1,3],但当我将置换的ArrayList添加到另一个ArrayList时,它们都打印为[1,2,3] 代码: 输

  • 问题内容: 说我有一个像这样的数组: 如何计算具有给定值的数字(在示例中为空白)? 而且有效吗?(大约十二个数组,每个数组包含数百个元素)此示例超时(超过30秒): 在这种情况下,空白元素的数量为3。 问题答案: 如何使用array_count _values来获得一个为您计算一切的数组?

  • 北卡罗来纳州彩票提供了几场平局游戏,其中两场是选3和选4。在0和9(含9)之间分别选择3或4位数字,数字可以重复(例如,9-9-9是有效的组合)。在这个例子中,我将使用Pick3,因为它更容易使用,但我试图使它成为一个通用的解决方案,可以使用任何数量的数字。 选3和选4的一个特点是“1选1”,这意味着如果至少有一个号码比你的票上的号码高1或低1,你就赢了一个奖。