不用二进制或其他方法求集合的子集

求集合的子集

说明

为什么针对这个问题过不去?
因为之前刚开始干这个,有个通过qq远程面试我,要我三分钟完整的把这个问题写出来,
过去那么久了,现在想想都来气,都明确说了之前没去整过算法,说着没事,让我三分钟写完整个,我光码字都不一定有这么快,有本事他在没接触过的清况下是个新手,把这个给我写完看看(广州)

按照正常的数学简单的逻辑求子集并在代码中实现,不想用网上那些二进制以及各种新奇的方法
数学逻辑
{1,2,3,4}

  1. 第一层:{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);
        }
    }
	
}

第三种方法:二进制(懒得写)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值