Во время собеседования или письменного теста я сталкивался с следующими 4 алгоритмами ручной работы о договоренности и комбинации много раз. Запишите здесь и проверьте метод в будущем:
1. массив без дублирующих элементов, найдите полное расположение;
2. Массивы с повторяющимися элементами, найдите полное расположение;
3. Для массива без дублирующих элементов найдите комбинацию [подмножество];
4. Массив с повторяющимися элементами, найдите комбинацию;
Приведенные выше четыре типа вопросов могут быть реализованы с использованием унифицированного шаблона, как показано ниже:
/ * *[Комбинация && Arangement] *Перечислите все комбинации чисел в массиве, такие как 1 и 2 как 1, 2, 12, 21. *Этот вопрос может быть расширен на четыре: *1. Массивы без дублирования чисел, найдите комбинации*2. Массивы с дублирующими числами, найдите комбинации*3. Массивы без дублирования чисел, найдите полное расположение*4. Массивы с дублирующими числами, найдите полное расположение *[Общая идея (рекурсия)]: *Определите функцию: выберите комбинацию префикса из кандидата, установленного кандидатом *Каждый раз удаляйте число из кандидата, установленного кандидатом и добавляйте префикс для печати префикса; *Рекурсивно удалите следующее число из нового кандидата и добавьте префикс *[Control для рекурсии] *Используйте хэшсет для сохранения префикса. Перед печатью определите, содержит ли хэшсет в данный момент сгенерированный префикс. *Если нет, распечатайте его и добавьте хэшсет; Если есть, не печатайте его *[Комбинация--》 Аранжировка] *Просто добавьте суждение перед печати: если кандидат на установленное кандидат является пустым, это означает, что обход завершается один раз, а договоренность-и вы можете распечатать */пакет xh.offer.practice; import java.util.arrays; импорт java.ut.hashset; java.util.list; public class listallgroup {public static void main (string [] args) {string [] array = {"1", "2"}; String [] repeat = {"1", "2", "1"}; ListallGroup test = new ListAllGroup (); System.out.println ("********* НЕТ РИСПЕРТА повторения *********"); test.listallnorepeate (arrays.aslist (array), ""); // инициализировать префикс = "" System.out.println ("********* Список повторений ******"); Hashset <string> norepeateset = new Hashset <string> (); test.listallrepeate (arrays.aslist (repeate), "", norepeateset); System.out.println ("***************** test.premutationnorepeate (Arrays.aslist (Array), ""); System.out.println ("*************************** Hashset <string> repeatset = new Hashset <string> (); test.premutateRepeate (arrays.aslist (repeate), ", RepeatSet); } // Комбинация без дупликации public void listallNorePeate (list <string> candicate, string prefix) {if (prefix.length ()! = 0) System.out.println (prefix); // Длина результата не 0, затем распечатайте комбинацию для (int i = 0; i <candicate.size (); I ++) Templist = new LinkedList <string> (кандидат); // Templist уменьшает число и временно сохраняет число удаленного в Templist String Tempstring = (String) Templist.remove (i); // рекурсивный ListallNorePeate (Templist, Prefix + TempString); }} // Существует дубликатная комбинация, добавить Hashset public void listallRepeate (list <string> кандидат, префикс строки, хэшсет <string> res) {if (prefix.length ()! = 0 &&! Res.contains (prefix)) {system.out.println (prefix); res.add (префикс); } for (int i = 0; i <candidate.size (); i ++) {list <string> templist = new LinkedList <string> (Candicate); String tempstring = templist.remove (i); ListAllRepeate (Templist, Prefix+TempString, Res); // Recurisive}} // Все договоренности без дупликации, добавить суждение Candicate.size () == 0 public void veratuttenorepeate (list <string> candicate, string prefix) {if (candicate.size () == 0) {System.out.print.println (prefix); } for (int i = 0; i <candicate.size (); i ++) {list <string> templist = new LinkedList <string> (Candicate); String tempstring = templist.remove (i); PremutteNorePeate (Templist, Prefix+Tempstring); }} // Существует повторное полное расположение, добавить хэшсет, чтобы помочь в суждении и выходе public void premutationReate (list <string> candicate, string prefix, hashset <string> res) {if (candicate.size () == 0 &&! Res.contains (prefix)) {system.out.println (prefix); res.add (префикс); } for (int i = 0; i <candidate.size (); i ++) {list <string> templist = new LinkedList <string> (кандидат); String tempstring = templist.remove (i); PremutateRepeate (Templist, Prefix+Tempstring, Res); }}} Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.