我正在尝试编写一种称为置换的方法。基本上,我希望它接受一个整数,然后返回数字从0到x -1的所有排列。我意识到这应该返回一个数组数组。但是,我正在努力实现这一目标。有人可以帮我更好地考虑这个问题吗?我在用Java编码。我意识到这可能是递归问题,但除此之外,我无所适从。
我考虑过要使用两种方法,一种采用整数,并使第一个数组从0-x-1开始。然后是另一个方法,该方法采用一个数组和一些整数“开始”。这样,索引开始处的整数将不会更改,但是会与其他数字交换。这将在for循环内,以便“开始”位置将在整个数组中变化。我对此的唯一提示是我的for循环将递归调用该方法。但是,我在思考如何实际实现此功能以及交换算法时遇到了麻烦。
有人可以告诉我我是否正在考虑这项权利,以及他们是否有任何想法或提示要给我?我没有代码可以共享,因为我对此一直怀有很大的想法。
答案 0 :(得分:1)
如果我对你的理解正确,这就是你想要的吗?
public class MyClass_3928{
static List<String> listOfAllArrays = new ArrayList<>();
public static void calculate(int[] list, int n) {
if (n == 1) {
listOfAllArrays.add(Arrays.toString(list));
} else {
for (int i = 0; i < n; i++) {
calculate(list, n - 1);
int j = (n % 2 == 0) ? i : 0;
int t = list[n - 1];
list[n - 1] = list[j];
list[j] = t;
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("How many numbers would you like to permute?");
int numbers = Integer.valueOf(scanner.nextLine());
int[] numbersArray = new int[numbers-1];
System.out.println("Those numbers are");
for (int i = 0; i < numbers-1; i++) {
numbersArray[i] = i+1;
}
calculate(numbersArray, numbersArray.length);
for (int i = 0; i < listOfAllArrays.size(); i++) {
System.out.println(listOfAllArrays.get(i));
}
}
答案 1 :(得分:1)
排列可以通过典型的回溯算法解决,在该算法中,我们必须遍历状态空间中的所有可能性。回溯是一个非常重要的算法,我的建议是您看看它(通常采用递归形式)并尝试掌握它的基本概念,而不是尝试以自己的方式解决渗透问题。>
基本上要找到一个排列,我们必须走n步(设置一位为一步),为每一步选择一位后,我们就有一个排列,所以我们有一个可能的解决方案(例如,{{ 1}})。之后,我们回溯到倒数第二个位,请注意,我们在第一个解决方案中选择了1,2,3,4,5,6
,但是我们可以有另一个选择5
,之后我们只有一个选择是6
。对于其他解决方案,我们继续回溯到倒数第三位,倒数第四位...,依此类推。这就是为什么回溯被命名的原因。
您可以将回溯与DFS或二叉树上的遍历算法进行比较。它们在很多地方彼此非常相似。
下面是我针对该问题的解决方案,其中的结果是一个arrayList,置换是根据5
而不是1...n
给出的,但其思想完全相同。
0...n-1
}