package com.kingdz.algorithm.time201705;
import java.util.ArrayList;
import java.util.List;
/**
* <pre>
* 求组合
* 有n个整数,从n个数中选出k个整数,求所有组合
* 思路是利用二进制来求解,比较简单
* </pre>
*
* @author kingdz
*
*/
public class Algo10 {
public static void main(String[] args) {
int k = 4;
String input = "8 11 12 13";
List<List<Integer>> ret = calAllCombine(input, k);
for (List<Integer> l : ret) {
System.out.println(l);
}
}
private static List<List<Integer>> calAllCombine(String input, int k) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
String[] array = input.split(" ");
List<Integer> innerList = new ArrayList<Integer>();
if (k > array.length) {
for (String str : array) {
innerList.add(Integer.parseInt(str));
}
list.add(innerList);
}
// System.out.println(Arrays.toString(array));
int time = 0;
while (true) {
// 计算二进制
String binStr = Integer.toBinaryString(time);
time++;
// 如果二进制的长度超长,则退出循环
if (binStr.length() > array.length) {
break;
}
// 判断二进制中1的个数,根据1所在的位置来判断某个数是否存在于组合中
int count = 0;
for (char c : binStr.toCharArray()) {
if (c == '1') {
count++;
}
}
if (count != k) {
continue;
}
// System.out.println(binStr);
// 遍历原始数组根据二进制将数字加入到组合中
innerList = new ArrayList<Integer>();
int end = binStr.length() - 1;
for (int i = array.length - 1; i >= 0; i--) {
if (end < 0) {
break;
}
char c = binStr.charAt(end);
end--;
if (c == '1') {
innerList.add(Integer.parseInt(array[i]));
}
}
list.add(innerList);
}
return list;
}
}
【算法】程序猿不写代码是不对的52
最新推荐文章于 2023-12-24 16:00:47 发布