连续正整数集合子集的java算法

来源:互联网 发布:react native和node.js 编辑:程序博客网 时间:2024/05/29 03:14

觉得这题有点意思,刚在qq空间发过,不过应该没什么人看,这里再发一次吧。


题目内容:一个连续的正整数子集,比如输入5代表{1,2,3,4,5},求其所有子集。
源自csdn上一哥们的提问,乍一看还是难下手的,说说我这里想到的方法。
比如1的时候只有{1}这个子集,2则有{1,2};{1};{2} 3的时候则有{1,2,3};{1,2};{1,3};{2,3};{1};{2};{3}
好像没有什么规律,仔细看其实还是有的。
2的情况是 1的每个子集再加上一个2构成的新集合这里是{1,2}加上1原来自己的子集{1}加上{2}这个集合。当然,3跟2的情况就一样了
撒,所以想到了用递归撒。

遇到的问题是list之间的拷贝,不能直接赋值滴,赋值之后传的是引用,任意一个list改变会引起另一个list变化,所以对于保存未改变之前的集合就做不到啦,所以找了个copy方法。
当然,这题可以拓展,稍微改动完全可以升级针对所有集合求子集的问题。有兴趣可以试试哟。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class MyEcoding {
 public static void main(String[] args) {
System.out.println("输入大于1的正整数");
Scanner input = new Scanner(System.in);
int m = input.nextInt();
List<List<Integer>> list1 = new ArrayList<List<Integer>>();
List<Integer> list1_1 =  new ArrayList<Integer>();
list1_1.add(1);
list1.add(list1_1);
for (int i = 1; i < m; i++) {
List<List<Integer>> list2 = new ArrayList<List<Integer>>();
copy(list1,list2);
for (int j = 0; j < list1.size(); j++) {
list1.get(j).add(i+1);
}
list1.addAll(list2);
List<Integer> list1_2 =  new ArrayList<Integer>();
list1_2.add(i+1);
list1.add(list1_2);
}
System.out.println(list1);
}
  public static void copy(List src,List dest){
        for (int i = 0 ;i < src.size() ; i++) {
            Object obj = src.get(i);            
            if (obj instanceof List){
                dest.add(new ArrayList());
                    copy((List)obj,(List)((List)dest).get(i));
            }else{
                dest.add(obj);
            }
        }
      }


0 0