【发布时间】: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