62,615
社区成员
发帖
与我相关
我的任务
分享
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.TreeSet;
public class Combination {
private static int NUM = 0;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入X个数,用逗号分割:");
String str = input.nextLine();
String[] datas = str.split(",");
System.out.println("请输入数字Y:");
NUM = input.nextInt();
if (NUM > datas.length) {
System.out.println("输入的Y必须小于等于X!");
return;
}
combine(Arrays.asList(datas));
}
private static void combine(List<String> datas) {
TreeSet<String> set = new TreeSet<String>();
for(String str : datas) {
set.add(str);
}
ArrayList<TreeSet<String>> subset = getSubset(set);
for(TreeSet<String> ts : subset) {
System.out.println(ts);
}
}
public static String[] getBinaryValue(TreeSet<String> set) {
int size = set.size();
int m = (int) Math.pow(2, size) - 1;
String[] result = new String[m + 1];
for (int i = m; i > -1; i--) {
StringBuffer sb = new StringBuffer(Integer.toBinaryString(i));
int length = sb.length();
if (length < size) {
for (int j = 0; j < size - length; j++) {
sb.insert(0, "0");
}
}
result[i] = sb.toString();
}
return result;
}
public static ArrayList<TreeSet<String>> getSubset(TreeSet<String> set) {
ArrayList<TreeSet<String>> result = new ArrayList<TreeSet<String>>();
String[] items = new String[set.size()];
int i = 0;
for (String item : set) {
items[i++] = item;
}
String[] binaryValue = getBinaryValue(set);
for (int j = 0; j < binaryValue.length; j++) {
String value = binaryValue[j];
TreeSet<String> subset = new TreeSet<String>();
for (int k = 0; k < value.length(); k++) {
if (value.charAt(k) == '1')
subset.add(items[k]);
}
if(subset.size() == NUM)
result.add(subset);
}
return result;
}
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class FullSort {
//将NUM设置为待排列数组的长度即实现全排列
private static int NUM = 0;
/**
* 递归算法:将数据分为两部分,递归将数据从左侧移右侧实现全排列
*
* @param datas
* @param target
*/
private static void sort(List datas, List target) {
if (target.size() == NUM) {
for (Object obj : target)
System.out.print(obj);
System.out.println();
return;
}
for (int i = 0; i < datas.size(); i++) {
List newDatas = new ArrayList(datas);
List newTarget = new ArrayList(target);
newTarget.add(newDatas.get(i));
newDatas.remove(i);
sort(newDatas, newTarget);
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入X个数,用逗号分割:");
String str = input.nextLine();
String[] datas = str.split(",");
System.out.println("请输入数字Y:");
NUM = input.nextInt();
if(NUM > datas.length) {
System.out.println("输入的Y必须小于等于X!");
return;
}
sort(Arrays.asList(datas), new ArrayList());
}
}