问题描述
用二进制生成{A,B,C}的子集
分析
import java.util.ArrayList;
public class A035_二进制生成子集 {
public static void main(String[] args) {
String[] sArr = { "A", "B", "C" };
ArrayList<ArrayList<String>> list = new ArrayList();
int cLen = (int) Math.pow(2, sArr.length);
for (int i = cLen - 1; i > 0; i--) {
int idx = sArr.length - 1;
ArrayList<String> t = new ArrayList();
while (idx >= 0) {
if ((i >> idx & 1) == 1) {
t.add(sArr[idx]);
}
idx--;
}
list.add(t);
}
for (int i = list.size() - 1; i > -1; i--) {
ArrayList<String> t = list.get(i);
for (int j = t.size() - 1; j > -1; j--) {
System.out.print(t.get(j));
}
System.out.print(" ");
}
}
}
步骤
- 为了让最终输出有序,先对要排列的集合进行排序,让他有序
- 创建ArrayList,让其内部再存放一个ArrayList
- 集合的个数,就是2的数组的长度的次方-1,所以求出cLen
- 第一个循环,从cLen开始,一直到0,不包含0,如果有0的话,就是空集了
- 在循环内,每次都新建一个ArrayList,用于存放每一个数字可以取到的集合
- 第二层循环用一个idx下标进行判断,这里用到了位运算的操作,比如,idx长度是2,那就就整体右移2位,与1进行运算,看是否为1,如果是,那就加入到集合t中,如果不是,那就再将idx–
- 第二层循环进行完毕后,再将临时的集合t,加入到整体集合list中
- 最后再倒着输出list,这里因为在集合里又套了一个集合,所以要用两层循环,倒着输出list