避免在java中以随机排列重复数组

我有以下代码:


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 个不可重复的元素。


富国沪深
浏览 132回答 2
2回答

陪伴而非守候

这应该打印出所有排列而不将它们存储在 HashMap 或列表中public static boolean nextPermutationArray(int[] a) {&nbsp; &nbsp; int i = a.length - 2;&nbsp; &nbsp; while (i >= 0 && a[i] >= a[i + 1]) {&nbsp; &nbsp; &nbsp; &nbsp; i--;&nbsp; &nbsp; }&nbsp; &nbsp; if (i < 0) {&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }&nbsp; &nbsp; int j = a.length - 1;&nbsp; &nbsp; while (a[i] >= a[j]) {&nbsp; &nbsp; &nbsp; &nbsp; j--;&nbsp; &nbsp; }&nbsp; &nbsp; int t = a[i];&nbsp; &nbsp; a[i] = a[j];&nbsp; &nbsp; a[j] = t;&nbsp; &nbsp; Collections.reverse(Arrays.asList(Arrays.copyOfRange(a, i + 1, a.length)));&nbsp; &nbsp; return true;}它将返回真,直到有一个使用它的前突变运行此代码public static void main(String[] args) {&nbsp; &nbsp; int[] a = new int[]{0, 1, 2, 3};&nbsp; &nbsp; do {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(Arrays.toString(a));&nbsp; &nbsp; } 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]

犯罪嫌疑人X

您可以将已返回的每个排列存储在 int[][] 类型的静态变量中。如果得到的结果已经在数组中,则可以进行另一个排列。重复直到你有一个新的排列。但是要小心,如果您想产生比可能更多的排列,这可能会造成无限循环!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java