자바 집합 에 있 는 모든 부분 집합 얻 기
집합 을 입력 하여 이 집합의 모든 부분 집합 을 출력 하 십시오.예 를 들 어 입력:1,2,4 출력 결 과 는 다음 과 같다.
[1]
[2]
[4]
[1, 2]
[1, 4]
[2, 4]
[1, 2, 4]
알 아야 할 것:공 집 은 모든 집합의 부분 집합 이다.진짜 부분 집합 은 부분 집합 을 포함 하지 않 는 집합 입 니 다.빈 부분 집합 이 아니면 부분 집합 과 빈 집합 을 포함 하지 않 습 니 다.
문제 풀이 방향:
이 문 제 는'비트 대응 법'으로 계산 할 수 있다.
예 를 들 어 집합 A={a,b,c}은 임의의 요소 에 대해 모든 하위 에 집중 하거나 존재 하지 않 습 니 다.부분 집합 으로 비 추기:
(a,b,c)
(1,1,1)->(a,b,c)
(1,1,0)->(a,b)
(1,0,1)->(a,c)
(1,0,0)->(a)
(0,1,1)->(b,c)
(0,1,0)->(b)
(0,0,1)->(c)
(0,0,0)->@(@빈 집합 표시)
상기 규칙 을 관찰 하면 컴퓨터 에 있 는 데이터 저장 방식 과 비슷 하기 때문에 하나의 정형 수 와 집합 매 핑 을 통 해...000~111.111(있 음,없 음,반대로 도 가능 함 을 나타 낸다).이 정형 수 를 통 해 한 번 씩 증가 하면 모든 수 를 얻 을 수 있다.즉,집합 에 해당 하 는 부분 집합 을 얻 을 수 있다.
주로 변위 연산 과 논리 적 사고력 을 고찰 하 는데 구체 적 인 코드 는 다음 과 같다(본 기계 의 진실 한 인증 을 거 쳐 절대적 으로 신뢰 할 수 있다).
import java.util.ArrayList;
import java.util.Scanner;
import org.apache.commons.collections.CollectionUtils;
/**
* ,
* @author liangyongxing
* @time 2017-02-06
*/
public class SubListExport {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
System.out.println(" :");
String inputString = new Scanner(System.in).next().toString();
if (inputString != null && !inputString.isEmpty()) {
String[] strArray = inputString.split(",");
for (String str : strArray) {
list.add(Integer.parseInt(str));
}
ArrayList<ArrayList<Integer>> allsubsets = getSubsets(list);
for(ArrayList<Integer> subList : allsubsets) {
System.out.println(subList);
}
}
}
public static ArrayList<ArrayList<Integer>> getSubsets(ArrayList<Integer> subList) {
ArrayList<ArrayList<Integer>> allsubsets = new ArrayList<ArrayList<Integer>>();
int max = 1 << subList.size();
for(int loop = 0; loop < max; loop++) {
int index = 0;
int temp = loop;
ArrayList<Integer> currentCharList = new ArrayList<Integer>();
while(temp > 0) {
if((temp & 1) > 0) {
currentCharList.add(subList.get(index));
}
temp>>=1;
index++;
}42 allsubsets.add(currentCharList);44 }
return allsubsets;
}
}
주:2017-02-08 10:01:32 상기 코드 는 일정한 구멍 이 있 습 니 다.즉,중복 숫자 를 입력 할 때 결 과 는 중복 부분 집합 출력 이 있 고 제목 의 요 구 를 만족 시 키 지 못 합 니 다.부분 집합 을 계산 할 때 HashSet 를 넣 어 배열 해 야 합 니 다.최종 인쇄 결 과 는 sets 에서 얻 으 면 됩 니 다.구체 적 인 수정 내용 은 다음 그림 과 같 습 니 다.1.주 함수 가 인쇄 된 곳 에서 받 은 반환 값 을 HashSet 형식 으로 수정 합 니 다.
2.함수 부분 에 서 는 패 키 징 목록 을 list 에서 set 로 변경 해 야 합 니 다.
이로써 수정 이 완료 되 었 습 니 다.테스트 실행 결 과 는 다음 과 같 습 니 다.
분석 코드 를 통 해 알 수 있 는 시간 복잡 도 는 O(n*log2n)이다.
코드 다운로드 주소:
https://github.com/liang68/interview
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.