Этот код работает для последовательностей символов длиной 1, 2 или 3, но если я продолжу писать его таким образом, чем больше я буду увеличивать максимальную длину, тем больше, неуклюже и повторяемо будет становиться все больше и больше повторяющихся символов. Я интуитивно чувствую, что должен быть какой-то рекурсивный способ сделать это более эффективно, но мне сложно понять, как именно.
Код написан на Java 11.
Код: Выделить всё
import java.util.ArrayList;
import java.util.Arrays;
//Pretend the class wrapper is here
public static ArrayList five6789Scramble(byte length) {
/*Returns all non-repeating permutations of the characters in charSet that don't start with the zero index
character
*/
if(length < 0) {
System.out.println("input length for five6789Scramble must not be negative");
throw new IndexOutOfBoundsException();
}
ArrayList charSet = new ArrayList(
Arrays.asList('a','b','c','d','e','f','g','h','i','j'
));
if(length>charSet.toArray().length) {
System.out.println("length specified for five6789Scramble is too long");
throw new IndexOutOfBoundsException();
}
ArrayList ret = new ArrayList();
for (byte i=1; i 1) {
ArrayList remainingChars = new ArrayList(charSet);
remainingChars.remove(i);
ArrayList toAddStarter = new ArrayList();
toAddStarter.add(charSet.get(i));
for (byte j=0; j 2) {
ArrayList toAddStarterTwo = new ArrayList(toAddStarter);
toAddStarterTwo.add(remainingChars.get(j));
ArrayList remainingCharsTwo = new ArrayList(remainingChars);
remainingCharsTwo.remove(j);
for(byte k=0; k 3)», который копирует код из блока «if (длина > 2)»? В конечном итоге я хочу получить длину 10, даже несмотря на то, что в результате вы получите 3 265 920 массивов длиной десять.
Мобильная версия