Selama wawancara atau tes tertulis, saya menemukan 4 algoritma yang memakan tangan berikut tentang pengaturan dan kombinasi berkali-kali. Perhatikan di sini dan periksa metode di masa mendatang:
1. Array tanpa elemen duplikat, temukan pengaturan penuh;
2. Array dengan elemen berulang, temukan pengaturan lengkap;
3. Untuk array tanpa elemen duplikat, temukan kombinasi [subset];
4. Array dengan elemen berulang, temukan kombinasi;
Empat jenis pertanyaan di atas dapat diimplementasikan menggunakan templat terpadu, seperti yang ditunjukkan di bawah ini:
/ * *[Kombinasi && Pengaturan] *Sebutkan semua kombinasi dalam array, seperti 1 dan 2 sebagai 1, 2, 12, 21. *Pertanyaan ini dapat diperluas menjadi empat: *1. Array tanpa angka duplikat, temukan kombinasi*2. Array dengan angka duplikat, temukan kombinasi*3. Array tanpa angka duplikat, temukan pengaturan penuh*4. Array dengan nomor duplikat, temukan pengaturan penuh *[Ide Umum (Rekursi)]: *Tentukan fungsi: Pilih awalan kombinasi dari kandidat yang ditetapkan kandiks *Hapus nomor dari kandidat yang ditetapkan kandiks setiap kali, dan tambahkan awalan untuk mencetak awalan; *Hapus nomor berikutnya dari kandidat baru dan tambahkan awalan *[kontrol untuk rekursi] *Gunakan hashset untuk menyimpan awalan. Sebelum mencetak, tentukan apakah hashset berisi awalan yang saat ini dihasilkan. *Jika tidak ada, cetak dan tambahkan hashset; Jika ada, jangan mencetaknya *[kombinasi--》 pengaturan] *Cukup tambahkan penilaian sebelum dicetak: jika kandidat menetapkan kandungan kosong, itu berarti bahwa traversal selesai sekali dan pengaturan dihasilkan, dan Anda dapat mencetak */paket xh.offers. java.util.list; import java.util.list; kelas publik listAllGroup {public static void main (string [] args) {string [] array = {"1", "2"}; String [] ulangi = {"1", "2", "1"}; ListAllGroup test = new ListAllGroup (); System.out.println ("********* No Repeat List *********"); test.listallnorepeate (arrays.aslist (array), ""); // inisialisasi awalan = "" System.out.println ("********* Daftar Ulangi ******"); Hashset <string> norepeateset = hashset baru <string> (); test.listallrepeate (arrays.aslist (ulangi), "", norepeateset); System.out.println ("*************** Tidak ada premutasi berulang ****************************"); test.premutationnorepeate (arrays.aslist (array), ""); System.out.println ("*********************** Premutasi ulangi *************************"); Hashset <string> repeatset = hashset baru <string> (); test.premutationrepeate (arrays.aslist (ulangi), "", ulangi); } //Combination without duplication public void listAllNoRepeate(List<String> candicate,String prefix){ if(prefix.length() != 0) System.out.println(prefix);//The result length is not 0, then print out the combination for(int i = 0;i < candicate.size();i++){ //Convert list to linklist to facilitate operation List<String> tempList = new LinkedList <String> (Candicate); // Templist mengurangi angka dan sementara menyimpan nomor yang dihapus dalam string templist tempsstring = (string) templist.remove (i); // ListAllnorEpeate (templist, awalan + tempsstring); }} // Ada kombinasi duplikat, tambahkan hashset public void listAllrePeate (daftar <string> kandidat, prefix string, hashset <string> res) {if (prefix.length ()! = 0 &&! Res.Contains (prefix)) {System.out.println (prefix); res.add (awalan); } untuk (int i = 0; i <candidate.size (); i ++) {Daftar <string> templist = new LinkedList <String> (candicate); String tempsstring = templist.remove (i); listAllrePeate (templist, awalan+tempsstring, res); // rekursif}} // semua pengaturan tanpa duplikasi, tambahkan penilaian candicate.size () == 0 public void premutationNoRePeate (Daftar <string> Candicate, String Prefix) {if (candicate.size () == 0) {System.out.out.out } untuk (int i = 0; i <candicate.size (); i ++) {Daftar <string> templist = new LinkedList <string> (candicate); String tempsstring = templist.remove (i); premutationNorEpeate (templist, awalan+tempsstring); }} // Ada pengaturan lengkap yang diulang, tambahkan hashset untuk membantu dalam penilaian dan output public void premutationRepeate (Daftar <String> Candicate, String Prefix, HashSet <String> res) {if (candicate.size () == 0 &&! Res.contains (prefix)) {System.out.println (prefix); res.add (awalan); } untuk (int i = 0; i <candidate.size (); i ++) {Daftar <string> templist = new LinkedList <String> (candicate); String tempsstring = templist.remove (i); premutationrepeate (templist, awalan+tempsstring, res); }}} Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.