让我们说输入是
int [] input = [1,2,3,4,5,6,7];
我想要一个4位数的唯一组合,无论下面的顺序如何 -
1234, 1235, 1236, 1237, 1245, 1246, 1247 etc.,
不受欢迎 -
4321,5321,6321,0000,0111等,//无论我想要的唯一顺序
等,
尝试以下方法 -
for (int i = 0; i < E-3; i++) { System.out.println(i+"::"+(i+1)+"::"+(i + 2)+"::"+(i+3)); } for (int i = 0; i < E-3; i++) { for (int j = i + 4; j < E; j++) { System.out.println(i+"::"+(i+1)+"::"+(i + 2)+"::"+j); System.out.println(i+"::"+(i+1)+"::"+j+"::"+(i + 3)); System.out.println(i+"::"+(j)+"::"+(i+2)+"::"+(i + 3)); System.out.println(j+"::"+(i+1)+"::"+(i+2)+"::"+(i + 3)); } }
仍有一些组合缺失(看起来上面的效率很低),你可以建议我缺少什么吗?
答案 0 :(得分:5)
只要数组的元素是唯一的,您就可以这样做:
int len = input.length();
for (int i = 0;i<len;i++) {
for (int j = i+1;j<len;j++) {
for (int k = j+1;k<len;k++) {
for (int l = k+1;l<len;l++) {
//print the numbers in order
//digits are: input[i] input[j] input[k] input[l]
}
}
}
}
这将使数字无论顺序如何都是唯一的,我认为正确的术语是排列(这是排列)与组合。
答案 1 :(得分:0)
我为这个问题编写了一个递归算法,并且我不确定它在java中是否具有语法性,所以把它作为伪代码。
perm(int input[],int output[],int len,int num,int j,int k)
{
int i;
if(k==SUM) { //SUM = 4
//print the numbers in output[0...SUM-1]
//return
}
for(i=j;i<=len-num;i++) {
output[k] =input[i];
perm(input,output,len,num-1,i+1,k+1);
}
}
一开始,
int input[]={1,2,3,4,5,6,7};
int output[4];
perm(input,output,7,4,0,0);