我的算法生成数字 0...n 的排列,其中 n 可以是 1 到 9 之间的任何数字。它适用于从 1 到 8 的数字。但是当我使用 9 运行它时,它会运行一段时间。然后突然中止进程并退出......没有错误消息或任何类似的东西!我在java中编码已经有一段时间了,从来没有遇到过这个错误。
我的算法:-
package utils;
import java.util.ArrayList;
class Lexicography {
static ArrayList<Long> perms = new ArrayList<Long>();
public static void main(String[] args){
long time = System.currentTimeMillis();
getPermutations(Integer.valueOf(args[0]));
System.out.println("\nSize:-"+perms.size()+"\nTime:-"+(System.currentTimeMillis()-time));
//This println is never printed... java aborts before that
}
public static ArrayList<Long> getPermutations(int num){
int[] n = new int[num+1];
for(int i=0; i<=num; i++) n[i]=i;
perms.add(getLong(n));
for(int i=num; i>=0; i--) permutate(n[i],n);
return perms;
}
private static void permutate(int k, int[] n){
if(k>n.length) return;
int p=0;
for(int i:n){ if(i==k) break; p++;}
for(int i=0; i<n.length; i++){
if(i==p || n[i]<k) continue;
n=swap(p,i,n);
perms.add(getLong(n));
System.out.println("i:"+(i+1)+" k:"+k+" n:"+getLong(n));//this prints all permutations till the last one and then poof!
for(int j=k-1; j>=0; j--) permutate(j,n);
n=swap(p,i,n);
}
}
private static int[] swap(int i, int f, int[] a){
int t=a[f];
a[f]=a[i]; a[i]=t;
return a;
}
private static long getLong(int[] n){
long ten=1, num=0;
for(int i=n.length-1; i>=0; i--){
num+=n[i]*ten; ten*=10;
}
return num;
}
}
如果没有 print 语句,直到 8 的数字运行得非常快(对于 8,它运行在 280 毫秒以下)。但是对于 9,它在打印最后一个排列后突然停止。有人可以帮忙吗?谢谢!