求集合的子集
说明
为什么针对这个问题过不去?
因为之前刚开始干这个,有个通过qq远程面试我,要我三分钟完整的把这个问题写出来,
过去那么久了,现在想想都来气,都明确说了之前没去整过算法,说着没事,让我三分钟写完整个,我光码字都不一定有这么快,有本事他在没接触过的清况下是个新手,把这个给我写完看看(广州)
按照正常的数学简单的逻辑求子集并在代码中实现,不想用网上那些二进制以及各种新奇的方法
数学逻辑:
{1,2,3,4}
- 第一层:{1},{2},{3},{4}
第二层:{1,2},{1,3},{1,4}
{2,3},{2,4}
{3,4}
第三层:{1,2,3},{1,2,4}
{2,3,4}
第四层:{1,2,3,4}
代码实现:
public class MyTest {
public void sout(List list){
int count=list.size();
int n=2;
List listinit=new LinkedList();
List result=new LinkedList();
//第一层遍历全部的循环
for (int i = 0; i < count; i++) {
String sfirst= String.valueOf(list.get(i));
listinit.add(sfirst);
result.add(sfirst);
}
//表示要循环几层,从第二层开始
while(n<count+1){
int num=listinit.size();
for (int i = 0; i <num ; i++) {
String sold= String.valueOf(listinit.get(0)) ;
String substring = sold.substring(sold.length() - 1, sold.length());
//可根据需求更改类型
int temp=Integer.parseInt(substring);
int i1 = list.indexOf(temp);
for (int j = i1+1; j <list.size() ; j++) {
String snew= String.valueOf(list.get(j)) ;
String sall=sold+snew;
listinit.add(sall);
result.add(sall);
}
//消费上一层的结果
listinit.remove(0);
}
n++;
}
System.out.println(result);
}
public static void main (String[]args){
MyTest myTest = new MyTest();
List list1 = new LinkedList();
list1.add(1);
list1.add(2);
list1.add(3);
list1.add(4);
list1.add(5);
list1.add(6);
myTest.sout(list1);
}
}
输出结果:[1, 2, 3, 4, 5, 6, 12, 13, 14, 15, 16, 23, 24, 25, 26, 34, 35, 36, 45, 46, 56, 123, 124, 125, 126, 134, 135, 136, 145, 146, 156, 234, 235, 236, 245, 246, 256, 345, 346, 356, 456, 1234, 1235, 1236, 1245, 1246, 1256, 1345, 1346, 1356, 1456, 2345, 2346, 2356, 2456, 3456, 12345, 12346, 12356, 12456, 13456, 23456, 123456]
第二种方式: 递归
public class Recurison{
public void printResult(List<Integer> originalData){
for(int i=1;i <= originalData.size();i++){
String fn="";
nextPosition(fn,1,i,originalData);
}
}
private void nextPosition(String fn, int position, int maxPosition, List<Integer> prepareData) {
if (position > maxPosition) {
System.out.println("fn = " + fn);
return;
}
for (Integer prepareDatum : prepareData) {
List<Integer> reduceUseData = prepareData.subList(prepareData.indexOf(prepareDatum)+1,prepareData.size());
nextPosition(fn + prepareDatum, position+1, maxPosition, reduceUseData);
}
}
}
第三种方法:二进制(懒得写)