【问题标题】:How to find permutations of array of ints with java如何使用java查找整数数组的排列
【发布时间】:2018-01-14 02:54:32
【问题描述】:

所以我正在做一些我将作为练习的课程的作业,因为教授似乎把它们留在了网上。然而,我目前的作业让我不知道如何找到 n 个数字的所有排列。他给了我们 sudo 代码,但是我很难翻译它。

    public void nextPerm(int[] a,int pivot,int suc){
    suc = 0;
    pivot = 0; 
    for(int i = a.length-1;; i--){
        if( i+1 != a.length)
            if(a[i] < a[i+1]){
                pivot = i;
                break;
            } else if(pivot == 0){
                reverseArray(a,pivot);//this just reverses the array from the right of the pivot point
                System.out.println(a);
        }
    }
    for(int i = a.length-1;;i--){
        if(a[i] > a[pivot]){
            suc = i;
            break;
        }
    }
    //swap pivot and suc
    int place = a[pivot];
    a[pivot] = a[suc];
    a[place] = a[pivot];
    reverseArray(a,pivot);
    System.out.println(Arrays.toString(a));


}



private void reverseArray(int[] a,int pivot) {//make pivot the index which it will reverse to the right of
    // TODO Auto-generated method stub
    int[] place = new int[a.length-pivot-1];
    int counter = 0;
    for(int i = a.length-1; i > pivot;i--){
        place[counter] = a[i];
        counter++;
    }
    counter = 0;
    int[] hold = new int[a.length];
    for(int i = 0; i <= pivot;i++){
        hold[i] = a[i];
        counter++;
    }
    for(int i = 0; i < place.length;i++){
        hold[counter] = place[i];
        counter++;
    }

    System.out.println(Arrays.toString(hold));
}

这是我目前所拥有的。基本上每次我运行 nextPerm 时,它都会将一个数组调整为另一个排列。欲了解更多信息,请查看此处的页面:link to more info

总结:nextPerm 通过手动更改数组一次找到所有可能的 perms。如果我不清楚,我很抱歉......我很新手。我也对此进行了研究,但是我在这方面没有取得任何进展并且正在苦苦挣扎。提前致谢。

【问题讨论】:

  • 所以您想使用查找下一个排列的逻辑来查找给定数字(以字符串形式给出)的所有可能排列?
  • 没有给定为 int,但是基本上使用然后再次运行 nextPerm 以获得下一个 perm,它再次操作数组以产生另一个排列
  • 我不明白。你能提供你输入的例子吗?
  • 所以基本上代码应该像这样工作:你从一组让我们说:{1,2,3,4} 所有这些都是整数。第一次迭代后,数组变为 1243,然后变为 1324,依此类推。我会在几秒钟内给出他给我们的 sudo 代码:
  • 如果当前元素小于其右侧邻居,则从右到左扫描数组 如果到达左端但未找到枢轴,则调用当前元素停止扫描 反转数组(排列在字典顺序上是最后的,所以重新开始) return 如果当前元素大于枢轴,则再次从右到左扫描数组 调用当前元素 后继者停止扫描 交换枢轴,后继者反转数组的一部分在找到枢轴的位置的右​​侧返回....这是更好的格式 pg 3 与链接

标签: java arrays algorithm permutation


【解决方案1】:

您只需要将上一步中获得的输出作为输入传递给下一步,直到您遍历所有可能的排列。这是相同的解释和伪代码。

假设您有一个数组[1,2,3,4]。数组中 4 个元素可能的总排列为 4!假设所有元素都是不同的。所以,只需为 nextPerm 4 迭代上面的代码!次。

int fact = factorial(array.length);
for(int i = 0;i<fact;i++){
    int[] b  = nextPerm(array);
    array = b;
}

假设您的 nextPrem 返回下一个排列数组。

【讨论】:

  • .... 我一定是对我的问题的描述很糟糕,但我需要 nextPerm 的帮助,我很难让它按照教授希望的方式工作。感谢下一部分的帮助:) 非常感谢。
  • @Zoralikecury:希望这个链接能更好地帮助你。这会找到字符串的下一个字典排列。同样的想法是你的教授在他给你的代码中实现的。 stackoverflow.com/questions/1622532/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2015-05-13
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
相关资源
最近更新 更多