为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

富国沪深 2022-01-06 17:00:03
我有以下代码: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));}该程序返回给我:0321023102310132我的问题是:有什么方法可以编辑方法nextPermutationArray来避免像0231. 换句话说,该方法应该返回 4 个不可重复的元素。
查看完整描述

2 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

这应该打印出所有排列而不将它们存储在 HashMap 或列表中


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;

}

它将返回真,直到有一个使用它的前突变运行此代码


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]


查看完整回答
反对 回复 2022-01-06
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

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


查看完整回答
反对 回复 2022-01-06
  • 2 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信