Избегайте повторения массивов в случайных перестановках в Java - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть следующий код:

public static void nextPermutationArray(int[] v) {
    int x = 1;
    int y;
    Random r = new Random();
    while (x < v.length) {
        y = x + r.nextInt(v.length - x);
        int temp = v[x];
        v[x] = v[y];
        v[y] = temp;
        x++;
    }
}

public static void main(String[] args) {
    int[] a = new int[]{0, 1, 2, 3};
    nextPermutationArray(a);
    System.out.println(Arrays.toString(a));
    nextPermutationArray(a);
    System.out.println(Arrays.toString(a));
    nextPermutationArray(a);
    System.out.println(Arrays.toString(a));
    nextPermutationArray(a);
    System.out.println(Arrays.toString(a));
}

Программа возвращает меня:

0321

0231

0231

0132

Мой вопрос: есть ли способ отредактировать метод nextPermutationArray, чтобы избежать случайных перестановок, таких как 0231. Другими словами, метод должен возвращать 4 неповторимых элемента.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Это должно распечатать все перестановки, не сохраняя их в HashMap или List

public static boolean nextPermutationArray(int[] a) {
    int i = a.length - 2;
    while (i >= 0 && a[i] >= a[i + 1]) {
        i--;
    }
    if (i < 0) {
        return false;
    }
    int j = a.length - 1;
    while (a[i] >= a[j]) {
        j--;
    }
    int t = a[i];
    a[i] = a[j];
    a[j] = t;
    Collections.reverse(Arrays.asList(Arrays.copyOfRange(a, i + 1, a.length)));
    return true;
}

он будет возвращать true, пока не будет предварительной настройки для его использования, запустите этот код

public static void main(String[] args) {
    int[] a = new int[]{0, 1, 2, 3};
    do {
        System.out.println(Arrays.toString(a));
    } while (nextPermutationArray(a));
}

вывод

[0, 1, 2, 3]
[0, 1, 3, 2]
[0, 2, 3, 1]
[0, 3, 2, 1]
[1, 3, 2, 0]
[2, 3, 1, 0]
[3, 2, 1, 0]
0 голосов
/ 06 ноября 2018

Вы можете сохранить каждую перестановку, которая уже была возвращена, в статической переменной типа int [] []. Если вы получите результат, который уже находится в массиве, вы можете сделать еще одну перестановку. Повторяйте, пока не получите новую перестановку. Но будьте осторожны, это может сделать бесконечный цикл, если вы хотите произвести больше перестановок, чем возможно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...