Java—数组的置换';s元素-清楚解释

Java—数组的置换';s元素-清楚解释,java,arrays,permutation,Java,Arrays,Permutation,我有一个整数数组,需要使用Java查找这些元素的所有可能排列。因此,我将在末尾有一个数组,其中包含数组,其中每个数组都是原始单个数组的排列。它必须适用于任何大小的数组 我可以为一个字符串这样做,但是数组让我绊倒了。我的元素是整数,所以我不能使用简单的字符串方法,例如,如果我的int是1,2,14,我将排列字符串1214。是否有可能操纵字符串并对其进行排列,然后通过某种方式过滤,在最后获得所需的排列 我环顾四周,似乎找到了一些算法,但实际上它们都只是大量代码,几乎没有解释,所以我无法理解它们。有没

我有一个整数数组,需要使用Java查找这些元素的所有可能排列。因此,我将在末尾有一个数组,其中包含数组,其中每个数组都是原始单个数组的排列。它必须适用于任何大小的数组

我可以为一个字符串这样做,但是数组让我绊倒了。我的元素是整数,所以我不能使用简单的字符串方法,例如,如果我的int是1,2,14,我将排列字符串1214。是否有可能操纵字符串并对其进行排列,然后通过某种方式过滤,在最后获得所需的排列

我环顾四周,似乎找到了一些算法,但实际上它们都只是大量代码,几乎没有解释,所以我无法理解它们。有没有人有这样的算法,一个解释过的算法

以下是我的字符串算法:

static String[] getPermutations( String str ) { 
List<String> perms = new ArrayList<>();
    permute( "", str, perms );
    String[] list = perms.toArray( new String[ perms.size() ] );
    return list;
}

// This function recursively calls itself
static void permute( String prefix, String str, List<String> perms ) {
        int n = str.length();
        if ( n == 0 ) {
        perms.add(prefix);
        } else {
            for ( int i = 0; i < n; i++ ) {
            permute( prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n), perms );
        }
    }
}
静态字符串[]获取置换(字符串str){
List perms=new ArrayList();
排列(“,str,perms);
String[]list=perms.toArray(新字符串[perms.size()]);
退货清单;
}
//此函数递归地调用自身
静态void排列(字符串前缀、字符串str、列表排列){
int n=str.length();
如果(n==0){
添加(前缀);
}否则{
对于(int i=0;i
类似于permute方法的内容。显然,必须对getPermutations方法进行相关更改。逻辑实际上与字符串示例相同

static void permute( List<Integer> prefix, List<Integer> ints, List<List<Integer>> perms ) {
        int n = ints.size();
        if ( n == 0 ) {
        perms.add(prefix);
        } else {
            for ( int i = 0; i < n; i++ ) {
                List<Integer> newPrefix = new ArrayList<Integer>();
                List<Integer> newInts = new ArrayList<Integer>();
                Collections.copy(prefix, newPrefix);
                Collections.copy(ints, newInts);

                newPrefix.add(ints.get(i));
                newInts.remove(i);

                permute( newPrefix, str.substring(0, i) + str.substring(i+1, n), perms );
            }
        }
}
静态无效排列(列表前缀、列表整数、列表排列){
int n=int.size();
如果(n==0){
添加(前缀);
}否则{
对于(int i=0;i

如果你是一个追求效率的人,那么你知道所有列表的最终大小,并且你知道排列列表的最终大小(N!),那么你可以使用数组,并保存到目前为止你在数组中的位置的整数。但是这个解决方案是最容易理解和实现的

只要将字符串想象成一个字符数组即可。那么你会如何为它创建排列呢?这两个字符串的算法几乎是相似的。我已经编辑了我的帖子来显示我的字符串算法。你知道我怎么做才能得到int[]吗?最重要的是你的
prefix+str.charAt(I)
必须创建一个更大的新数组,并将所有前缀元素复制到其中,然后在最后str[I]。除非它不是str,它将是一个int数组。这并不像我想象的那么简单。好问题@Amoeba