Q7.1.1 한 그룹의 수의 조합을 모두 열거하다
하나의 수조 안의 수의 조합을 모두 열거합니다. 예를 들어 1과 2열은 1,2,12,21입니다.
분석:
이 문제는 여러 가지 확장이 있는데,
1, 중복된 원소의 수의 조합이 없다(자집의 전체 배열 포함).
2, 중복 원소의 수의 조합이 있다.
3, 중복 원소의 수가 없는 전체 배열;
4, 중복된 원소의 수의 전체 배열이 있다.
1, 중복된 원소의 수가 없는 조합
사고방식: 그룹 요소를 LinkedList에 저장하고 List를 훑어보며 현재 요소를 삭제하고 이 요소를 결과에 추가합니다. 결과 길이가 0이 되지 않으면 출력합니다.
package javainterview;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class Q7_1_1_a {
public static void listAll(List<Integer> candidate, String prefix){
if(prefix.length()!=0){
System.out.println(prefix);
}
for(int i=0; i<candidate.size(); i++){
List<Integer> temp = new LinkedList<Integer>(candidate);
int item = (int)temp.remove(i);
listAll(temp, prefix+item);
}
}
public static void main(String[] args) {
Integer[] array = {1,2};
List<Integer> list = Arrays.asList(array);
listAll(list, "");
}
}
2, 중복된 원소의 수가 있는 조합
사고방식은 중복 요소가 있기 때문에 1의 방법에 따라 중복 상황이 발생할 수 있다. 이곳의 처리 방법은 결과를 하나의 HashSet에 저장하고 결과를 얻을 때마다 HashSet에 이미 존재하고 존재하지 않는지 검사하여 출력하는 것이다.
package javainterview;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
public class Q7_1_1_b {
public static void listAll(List<Integer> candidate, String prefix, HashSet<String> hs){
if(prefix.length()!=0 && !hs.contains(prefix)){
System.out.println(prefix);
hs.add(prefix);
}
for(int i=0; i<candidate.size(); i++){
List<Integer> temp = new LinkedList<Integer>(candidate);
int item = (int)temp.remove(i);
listAll(temp, prefix+item, hs);
}
}
public static void main(String[] args) {
Integer[] array = {1,1,2};
List<Integer> list = Arrays.asList(array);
HashSet<String> hs = new HashSet<String>();
listAll(list, "", hs);
}
}
3, 중복 요소의 전체 정렬 없음
사고방식, 다른 점은 모든 원소의 전체 배열만 하면 자집을 하지 않는다는 것이다.그러면 출력할 때 판단을 하나 더 하면 됩니다.list의size는 0입니다.
package javainterview;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class Q7_1_1_c {
public static void listAll(List<Integer> candidate, String prefix){
if(candidate.size()==0 && prefix.length()!=0){
System.out.println(prefix);
}
for(int i=0; i<candidate.size(); i++){
List<Integer> temp = new LinkedList<Integer>(candidate);
int item = (int)temp.remove(i);
listAll(temp, prefix+item);
}
}
public static void main(String[] args) {
Integer[] array = {1,2};
List<Integer> list = Arrays.asList(array);
listAll(list, "");
}
}
편리를 위해 문자열 전체 배열이든 그룹 전체 배열이든 모두 LinkedList로 바꾸어 처리합니다
package javainterview;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class Permutation {
public static List<String> permutation(String s){
List<String> res = new ArrayList<String>();
if(s==null) return res;
List<Character> list = new LinkedList<Character>();
for(int i=0; i<s.length(); i++)
list.add(s.charAt(i));
permutation(res, list, "");
return res;
}
public static void permutation(List<String> res, List<Character> list, String prefix){
if(list.size()==0)
res.add(prefix);
for(int i=0; i<list.size(); i++){
List<Character> temp = new LinkedList<Character>(list);
char item = (char)temp.remove(i);
permutation(res, temp, prefix+item);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "";
List<String> res = permutation(s);
for(String item : res)
System.out.println(item + ";");
}
}
4, 중복 요소의 전체 배열
사고방식: HashSet으로 결과를 저장합니다.
package javainterview;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
public class Q7_1_1_d {
public static void listAll(List<Integer> candidate, String prefix, HashSet<String> hs){
if(candidate.size()==0 && prefix.length()!=0 && !hs.contains(prefix)){
System.out.println(prefix);
hs.add(prefix);
}
for(int i=0; i<candidate.size(); i++){
List<Integer> temp = new LinkedList<Integer>(candidate);
int item = (int)temp.remove(i);
listAll(temp, prefix+item, hs);
}
}
public static void main(String[] args) {
Integer[] array = {1,1,2};
List<Integer> list = Arrays.asList(array);
HashSet<String> hs = new HashSet<String>();
listAll(list, "", hs);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 백엔드에서 데이터를 트리로 변환하고 맵은 json 트리를 생성하여 백엔드로 되돌려줍니다. (백엔드 변환)java 백엔드, 데이터를 트리로 변환하고,map는 json 트리를 생성하여 전방으로 되돌려줍니다(백엔드 변환) 1. 왜 이런 블로그를 쓰나요? 2.java 백엔드 코드 3. 전환된 데이터는 다음과 유사한 형식으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.