获取int []的排列删除重复集

cyp*_*aya 3 java permutation

我有一个[]的整数1 <= N <= 100,我怎么能得到这个数组的排列? - >数组可能包含重复项,因此产生的排列集可能重复,因此需要获取所有非重复的排列.

  • 我发现很多片段会将int []转换为字符串并执行排列和打印输出,但是因为我这里是范围1 <= N <= 100的整数,所以将它们转换为字符串会破坏整数.
  • 我可以获得所有重复的排列,包括,对于最后一组排列,删除重复项必须相互检查
    以删除重复的左右,它是如此繁重的过程.

有没有更简单的方法?

例如:123会给

231
321
312
132
213
123
Run Code Online (Sandbox Code Playgroud)

同样的112计划会给

121
211
211
121
112
112
Run Code Online (Sandbox Code Playgroud)

因此,对于n组元素,排列将是n!随着元素的重复,将减少,我问我怎么能删除那些重复集.(重复的置换集合arr [])

Rog*_*sjö 6

如果首先对词素进行词法排序是可以接受的,那么你就可以进行词汇排列.包括为int数组执行的算法,可以轻松修改为字符串.

public static boolean permuteLexically(int[] data) {
    int k = data.length - 2;
    while (data[k] >= data[k + 1]) {
        k--;
        if (k < 0) {
            return false;
        }
    }
    int l = data.length - 1;
    while (data[k] >= data[l]) {
        l--;
    }
    swap(data, k, l);
    int length = data.length - (k + 1);
    for (int i = 0; i < length / 2; i++) {
        swap(data, k + 1 + i, data.length - i - 1);
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

如何使用它的示例

public static void main(String[] args) {
    int[] data = { 1,2,3 };
    do {
        System.err.println(Arrays.toString(data));
    } while(Util.permuteLexically(data));
}
Run Code Online (Sandbox Code Playgroud)

你可以用[1,2,3]来使用它

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
Run Code Online (Sandbox Code Playgroud)

用[1,1,3]你得到

[1, 1, 3]
[1, 3, 1]
[3, 1, 1]
Run Code Online (Sandbox Code Playgroud)

这就是我想的那个问题.

由于该方法以字典顺序重新调整"下一个"排列,因此对元素进行排序是很重要的.从[3,2,1]开始,您不再获得更多排列(与上面的示例相比).