連續正整數集合子集的java算法

覺得這題有點意思,剛在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);
            }
        }
      }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章