인터뷰 또는 서면 시험 중에, 나는 배열과 조합에 대한 다음 4 개의 손 뚫는 알고리즘을 여러 번 만났다. 여기에 메모를하고 앞으로 방법을 확인하십시오.
1. 중복 요소가없는 배열, 전체 배열을 찾으십시오.
2. 반복적 인 요소가있는 배열, 전체 배열을 찾으십시오.
3. 중복 요소가없는 배열의 경우 조합 [서브 세트]을 찾으십시오.
4. 반복 된 요소가있는 배열, 조합을 찾으십시오.
위의 네 가지 유형의 질문은 아래와 같이 통합 템플릿을 사용하여 구현할 수 있습니다.
/ * *[combind && ranchement] *1과 2와 같은 배열의 모든 숫자 조합을 1, 2, 12, 21으로 나열하십시오. *이 질문은 4 가지로 확장 될 수 있습니다. *1. 중복 숫자가없는 배열은 조합을 찾으십시오*2. 중복 숫자가있는 배열은 조합을 찾으십시오*3. 중복 숫자가없는 배열은 전체 배열을 찾으십시오*4. 중복 숫자가있는 배열, 전체 배열 찾기 *[일반 아이디어 (재귀)] : *함수 정의 : 후보자 세트 Candicate에서 조합 접두사를 선택하십시오. *새 후보에서 다음 번호를 재귀 적으로 제거하고 접두사 *[재귀 제어] *접두사를 사용하여 접두사를 저장하십시오. 인쇄하기 전에 해시셋에 현재 생성 된 접두사가 포함되어 있는지 확인하십시오. *없으면 인쇄하고 해시 세트를 추가하십시오. 인쇄하지 않는 경우 *[조합-》 배열] *인쇄하기 전에 판단을 추가하십시오. 후보자 세트 Candicate가 비어 있으면 횡단이 한 번 완료되고 배열이 생성되며 배열이 생성되며 xh.offer.practice; import java.util.arrays; import java.util.hashest; import java.util.lokedlist; java.util.list; import java.util.list; public class listallgroup {public static void main (String [] args) {String [] array = { "1", "2"}; 문자열 [] 반복 = { "1", "2", "1"}; ListAllGroup Test = 새 ListAllGroup (); System.out.println ( "********* 반복 목록 없음 ***********"); test.listallnorepeate (arrays.aslist (array), ""); // prefix 초기화 = ""system.out.println ( "********* 반복 목록 *******"); Hashset <string> norepeateset = new Hashset <string> (); test.listallRepeate (arrays.aslist (반복), ", norepeateset); System.out.println ( "***************** 반복적 인 사전 교정 없음 *************************************"); test.premationnorepeate (arrays.aslist (array), ""); System.out.println ( "******************************* 반복적 인 사후 *****************************************"); Hashset <string> repeatset = new Hashset <문자열> (); test.premutationRepeate (arrays.aslist (repeate), "", 반복 세트); } // 복제가없는 조합 public void listallnorepeate (list <string> candicate, string prefix) {if (prefix.length ()! = 0) system.out.println (prefix); // 결과 길이는 0이 아닙니다. 그런 다음 (int i = 0; i <candice.size ()에 대한 조합을 인쇄하십시오. templist = new LinkedList <string> (candicate); // templist는 숫자를 줄이고 일시적으로 Templist String tempstring = (String) templist.remove (i)에서 제거 된 숫자를 일시적으로 저장합니다. // 재귀 ListAllNorePeate (templist, prefix + tempstring); }} // 중복 조합이 있습니다. 해시 세트 추가 공용 void listallRepeate (list <string> 후보자, 문자열 접두사, Hashset <string> res) {if (prefix.length ()! = 0 && res.contains (prefix)) {system.out.println (prefix); res.add (접두사); } for (int i = 0; i <inductate.size (); i ++) {list <string> templist = new LinkedList <string> (candicate); 문자열 tempstring = templist.remove (i); ListAllRepeate (templist, prefix+tempstring, res); // recursive}} // 복제가없는 모든 배열, 심판 candicate.size.size () == 0 public void premutionnorepeate (list <string> candicate, String prefix) {if (candicate.size () = 0) {system.out.prix.prix); } for (int i = 0; i <candicate.size (); i ++) {list <string> templist = new LinkedList <string> (candicate); 문자열 tempstring = templist.remove (i); Prematchnorepeate (Templist, Prefix+tempstring); }} // 반복적 인 완전한 배열이 있습니다. 판단 및 출력을 지원하고 공개 void premutationrepeate (list <string> candice, String prefix, hashset <string> res) {if (candicate.size () == 0 &&! res.contains (prefix)) {system.out.println (prefix); res.add (접두사); } for (int i = 0; i <inductate.size (); i ++) {list <string> templist = new LinkedList <string> (candicate); 문자열 tempstring = templist.remove (i); PrematchePeate (Templist, Prefix+Tempstring, Res); }}} 위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.