Während des Interviews oder des schriftlichen Tests stieß ich die folgenden 4 handgefertigten Algorithmen über Arrangement und Kombination um ein Vielfaches. Notieren Sie sich hier und überprüfen Sie die Methode in Zukunft:
1. Ein Array ohne doppelte Elemente finden Sie die vollständige Anordnung;
2. Arrays mit wiederholten Elementen finden die volle Anordnung;
3. Finden Sie für ein Array ohne doppelte Elemente die Kombination [Untermenge];
4. Ein Array mit wiederholten Elementen finden Sie die Kombination;
Die oben genannten vier Arten von Fragen können unter Verwendung einer einheitlichen Vorlage implementiert werden, wie unten gezeigt:
/ * *[Kombination && Arrangement] *Listen Sie alle Kombinationen in einem Array auf, z. B. 1 und 2 als 1, 2, 12, 21. *Diese Frage kann in vier erweitert werden: *1. Arrays ohne doppelte Zahlen finden Sie Kombinationen*2. Arrays mit doppelten Nummern finden Sie Kombinationen*3. Arrays ohne doppelte Zahlen finden Sie die vollständige Anordnung*4. Arrays mit doppelten Zahlen, finden Sie die vollständige Anordnung *[Allgemeine Idee (Rekursion)]: *Eine Funktion definieren: Wählen Sie ein Kombinationsprefix aus dem Kandidaten -Set -Kandikat *Kandidat *Entfernen Sie eine Nummer aus dem Kandidaten -Kandidaten und fügen Sie das Präfix zum Drucken von Präfix hinzu. *Entfernen Sie die nächste Nummer rekursiv vom neuen Kandidaten und fügen Sie Präfix hinzu *[Steuerung für Rekursion] *Verwenden Sie Hashset, um das Präfix zu speichern. Stellen Sie vor dem Druck fest, ob das Hashset das derzeit generierte Präfix enthält. *Wenn es nein gibt, drucken Sie es aus und fügen Sie Hashset hinzu; Wenn es vorhanden ist, drucken Sie es nicht aus *[Kombination-》 Arrangement] *Fügen Sie einfach ein Urteil vor dem Drucken hinzu: Wenn der Kandidat der Kandidaten leer ist, bedeutet dies, dass der Traversal einmal abgeschlossen ist und eine Anordnung generiert wird und Sie */paket xh.former.practice; practice; java.util. java.util.list; public class listAllGroup {public static void main (string [] args) {String [] array = {"1", "2"}; String [] repuoled = {"1", "2", "1"}; listAllGroup test = new ListAllGroup (); System.out.println ("********* Keine Wiederholungsliste *********"); test.listallnorepeate (arrays.aslist (array), ""); // initialisieren prefix = "" System.out.println ("******************************"); HashSet <String> norepeateset = new Hashset <string> (); test.listallrepeate (arrays.aslist (repeate), "", norepeateset); System.out.println("*************** no repeat premutation******************************"); test.premutationNorepeate (arrays.aslist (array), ""); System.out.println("***************************repeate premutation***************************"); HashSet <String> repuotset = new Hashset <string> (); test.PremutationRepeate (Arrays.aslist (Wiederholung), "", Wiederholung); } // Kombination ohne Duplikation public void listAllnorepeate (list <string> candicate, String prefix) {if (prefix.length ()! templist = new LinkedList <String> (Kandidat); // Templist reduziert eine Zahl und speichert die in Templist String tempstring = (String) Templist entfernte Nummer vorübergehend. Remove (i); // rekursive listAllnorepeate (Templist, Präfix + tempstring); }} // Es gibt eine doppelte Kombination, fügen Sie Hashset public void ListAllRepeate hinzu (List <String> Kandidat, String -Präfix, Hashset <string> res) {if (prefix.length ()! = 0 &&! Res.Add (Präfix); } für (int i = 0; i <candidate.size (); i ++) {list <string> templist = new LinkedList <string> (Candicate); String tempstring = templist.remove (i); ListAllRepeate (Templist, Präfix+Tempstring, res); // rekursiv}} // Alle Arrangements ohne Duplikation, achten Sie die Beurteilung Candicate. } für (int i = 0; i <candicate.size (); i ++) {list <string> templist = new LinkedList <string> (Candicate); String tempstring = templist.remove (i); PremutationNorepeate (Templist, Präfix+Tempstring); }} // Es gibt eine wiederholte vollständige Anordnung, fügen Sie Hashset hinzu, um die Beurteilung zu unterstützen und public void PremutationRepeate (List <String> Candicate, String Prefix, Hashset <string> res) {if (candicate.size () == 0 &&! Res.Contains (Prefix)) {System.Out.println (Prefix); Res.Add (Präfix); } für (int i = 0; i <candidate.size (); i ++) {list <string> templist = new LinkedList <string> (Candicate); String tempstring = templist.remove (i); PremutationRepeate (Templist, Präfix+Tempstring, Res); }}} Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.