0

我正在处理我必须显示数组长度的可能排列的任务。我尝试了一些技巧,但它仍然给出了许多输出的列表,最后我的项目崩溃了。

我已经尝试过数学,我得到了答案“39916800。

例如:对于输入数组[3,2,1,4,6],总共有5个!= 120 可能。

问题是:

鉴于 int [] a = [3, 10, 4, 6, 1, 8, 5, 9, 0, 11, 7, 2]。你需要多久与自己置换一次a,直到你再次得到a(这就是所谓的a的度数)?

示例:[0,2,1] 的次数为 2,因为 permute ([0,2,1], [0,2,1]) = [0,1,2] 和 permute ([0,1, 2],[0,2,1]) = [0,2,1]。

答案应该是 8 位数字。

这是我的代码:

public class Permute{
static void permute(java.util.List<Integer> arr, int k){
    for(int i = k; i < arr.size(); i++){
        java.util.Collections.swap(arr, i, k);
        permute(arr, k+1);
        java.util.Collections.swap(arr, k, i);
    }
    if (k == arr.size() -1){
        System.out.println(java.util.Arrays.toString(arr.toArray()));
    }
}
public static void main(String[] args){
    Permute.permute(java.util.Arrays.asList(3,4,6,2,1), 0);
}

}

4

2 回答 2

0

看看下面的例子:

public class Main {
    static int[] requestedNumbs = {3,4,6,2,1};


public static List<List<Integer>> permuteUnique(int[] nums, int index) {
        List<List<Integer>> newList = new LinkedList<>();
        if (index == nums.length - 1) {
            List<Integer> newPermute = new LinkedList<>();
            newPermute.add(nums[index]);
            newList.add(newPermute);
        } else {
            List<List<Integer>> oldList = permuteUnique(nums, index + 1);
            for (List<Integer> permute : oldList) {
                int permuteSize = permute.size();
                int i = 0;
                for (; i < permuteSize; i++) {
                    List<Integer> newPermute = new LinkedList<>();
                    newPermute.addAll(permute.subList(0, i));
                    newPermute.add(nums[index]);
                    newPermute.addAll(permute.subList(i, permuteSize));
                    newList.add(newPermute);
                    if (permute.get(i) == nums[index]) {
                        break;
                    }
                }
                if (i == permuteSize) {
                    List<Integer> newPermute = new LinkedList<>();
                    newPermute.addAll(permute.subList(0, permuteSize));
                    newPermute.add(nums[index]);
                    newList.add(newPermute);
                }
            }
        }
        return newList;
    }

    public static void main(String[] args) {
       List<List<Integer>> list = permuteUnique(requestedNumbs,0);
       System.out.println("Size of a list: " + list.size());
       System.out.println(list);
    }
}
于 2019-02-20T08:23:49.097 回答
0

如果您的任务只是计算给定数组的可能排列,则不需要实际生成和输出这些排列。请注意,数字呈指数增长。相反,您可以仅以数学方式计算数字。就做吧!在一个简单的 for 循环中。

如果真的只能有唯一的整数:

public int permutations(int[] numbers){
  int result = 1;
  for(int i=2; i<=numbers.size(); i++){
    result*=i;
  }
  return result;
}
于 2019-02-20T08:38:18.240 回答