java算法题–递归求数组中数字排列组合问题
题目:有一个数组{1,2,3},输出数组中数字的所有可能组合;
比如:123、132、213…
解题思路
通过递归不停的交换数组中的两个数(当然,肯定是有规律的交换)
大概过程如下图:
代码如下:
/*
* 题目:一个数组{1,2,3},输出数组中数字的所有排列情况
* 思路:递归交换两个数
* k=0 依次交换 0,0 0,1 0,2 得到 123 213 321
* 上次得到的数再递归调用函数:
* k=1 123交换得到 123 132
* 213交换得到 213 231
* 321交换得到 321 312
*/
public class Exercise1 {
private static int count = 0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] arr = {1, 2, 3};
solution(arr, 0);
System.out.println("count: " + count);
}
/*
* 递归调用函数交换数组中的数
*/
public static void solution(int[] arr, int k) {
int n = arr.length;
if (k == n) {
for (int i : arr) {
System.out.print(i);
}
count++;
System.out.println();
}
for (int i = k; i < n; i++) {
swap(arr, k, i);
solution(arr, k + 1);
swap(arr, k, i);
}
}
/*
* 交换数组中两个数
*/
public static void swap(int[] arr, int x, int y) {
if (x != y) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
运行结果
123
132
213
231
321
312
count: 6