您的位置:首页 > 编程语言 > Java开发

JAVA 实现全排列和组合

2018-03-25 21:54 447 查看
参考了这篇文章
https://blog.csdn.net/leixingbang1989/article/details/47761171

代码:

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Main {

public static void arrange(String s, List<Integer> list) {
if (list.size() == 0) {
System.out.println(s);
} else {
for (int i = 0; i < list.size(); ++i) {
List<Integer> temp = new LinkedList<>(list);
//取出一个数,剩下的数进行全排列
Integer remove = temp.remove(i);
arrange(s + remove, temp);
temp = null;
}
}
}

public static void group(String s, List<Integer> list, int n) {
if (n == 0) {
System.out.println(s);
} else {
for (int i = 0; i < list.size(); ++i) {
Integer integer = list.get(i);
int length = s.length();
//限定前面的数比后面的小,用来去重复,例如 1 2 和2 1
if(length != 0 && s.charAt(length - 1) > integer + '0'){
continue;
}
List<Integer> temp = new LinkedList<>(list);
Integer remove = temp.remove(i);
group(s + remove, temp, n - 1);
temp = null;
}
}
}

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<Integer> list = new LinkedList<>();
for (int i = 1; i <= n; ++i) {
list.add(i);
}
arrange("", list);
System.out.println();
group("", list, 2);
System.out.println();
}
}


2018/3/28补充
不用每次都新建一个list,只需要将之前remove掉的值交换,换到前面即可

public static void swap(List<Integer> list, int i, int j){
Integer src = list.get(i);
Integer dst = list.get(j);
Integer temp = src;
src = dst;
dst = temp;
}

public static void arrange2(String s, List<Integer> list, int start) {
if (start == list.size()) {
System.out.println(s);
} else {
for (int i = start; i < list.size(); ++i) {
swap(list, start, i);
arrange2(s + list.get(start), list, start + 1);
swap(list, start, i);
}
}
}


可以参考https://blog.csdn.net/qq_34115899/article/details/79733654

然而,上面这段代码是错误的
错误的
错误的
错误的
因为这样根本没办法交换list里面的2个值

原因请看

解决方法,可以用list的set方法,也可以改成int数组
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 排列组合