Java 重复元素时需要从数组中打印唯一的数字组合

Java 重复元素时需要从数组中打印唯一的数字组合,java,Java,我需要写一个程序,在那里我将打印一个数组中唯一的数字组合。 例子: 输入为{1,2,1} 输出应为:121112211 我尝试了下面的代码,但它只返回1个组合。 也应该是标准输入 import java.util.ArrayDeque; 导入java.util.Deque; 班长 { 静态void组合util(int arr[],int data[],int start, int end,int index,int r) { //当前组合已准备好打印,请打印它 如果(索引==r) { 对于

我需要写一个程序,在那里我将打印一个数组中唯一的数字组合。 例子: 输入为{1,2,1} 输出应为:121112211 我尝试了下面的代码,但它只返回1个组合。 也应该是标准输入


import java.util.ArrayDeque;
导入java.util.Deque;
班长
{
静态void组合util(int arr[],int data[],int start,
int end,int index,int r)
{ 
//当前组合已准备好打印,请打印它
如果(索引==r)
{ 

对于(int j=0;j,此任务调用置换。您需要找到给定数字的所有置换

public static void main(String[] args) {
    System.out.println(permute(1, 2, 1));   // [[2, 1, 1], [1, 1, 2], [1, 2, 1]]
}

public static Set<String> permute(int... nums) {
    if (nums == null || nums.length == 0)
        return Collections.emptySet();

    Arrays.sort(nums);
    return permute(new HashSet<>(), nums, -1);
}

private static Set<String> permute(Set<String> res, int[] nums, int j) {
    j++;

    if (j == nums.length - 1)
        res.add(Arrays.toString(nums));
    else {
        for (int i = j; i < nums.length; i++) {
            swap(nums, j, i);
            permute(res, nums, j);
            swap(nums, j, i);
        }
    }

    return res;
}

private static void swap(int[] nums, int i, int j) {
    int tmp = nums[i];
    nums[i] = nums[j];
    nums[j] = tmp;
}
publicstaticvoidmain(字符串[]args){
System.out.println(permute(1,2,1));//[[2,1,1],[1,1,2],[1,2,1]]
}
公共静态集置换(int…nums){
if(nums==null | | nums.length==0)
返回集合;
数组。排序(nums);
返回置换(newhashset(),nums,-1);
}
私有静态集合置换(集合分辨率,int[]nums,int j){
j++;
如果(j==nums.length-1)
res.add(Arrays.toString(nums));
否则{
对于(int i=j;i
这不是家庭作业问题。我看到您声明了
r
,但没有初始化它。不确定这是否是故意的,但可以肯定这是您看到的行为的部分原因。此外,您
combinationUtil()返回
打印当前组合后。考虑到您将
索引
作为0传递给该方法,并且
r
默认初始化为0,但从未修改过,那么该代码正是按照它的意图执行的:打印当前组合。@Just Another Developer,是的,我现在已将r初始化为3,但结果仍然相同:(您始终可以将代码与进行比较。如果行为不同,那么代码中显然存在差异。或者您正在使用的输入中存在差异,这会影响代码的行为。请逐步通过调试器运行这两种方法,并查看它们的差异。这很有意义,我们将尝试一下。
public static void main(String[] args) {
    System.out.println(permute(1, 2, 1));   // [[2, 1, 1], [1, 1, 2], [1, 2, 1]]
}

public static Set<String> permute(int... nums) {
    if (nums == null || nums.length == 0)
        return Collections.emptySet();

    Arrays.sort(nums);
    return permute(new HashSet<>(), nums, -1);
}

private static Set<String> permute(Set<String> res, int[] nums, int j) {
    j++;

    if (j == nums.length - 1)
        res.add(Arrays.toString(nums));
    else {
        for (int i = j; i < nums.length; i++) {
            swap(nums, j, i);
            permute(res, nums, j);
            swap(nums, j, i);
        }
    }

    return res;
}

private static void swap(int[] nums, int i, int j) {
    int tmp = nums[i];
    nums[i] = nums[j];
    nums[j] = tmp;
}