1

假设输入是

int[] 输入 =[1, 2, 3, 4, 5, 6, 7];

我想要一个 4 位数字的唯一组合,而与下面的顺序无关 -

1234, 1235, 1236, 1237, 1245, 1246, 1247 etc.,

不想要的 -

4321, 5321, 6321, 0000, 0111 等,//不管我想要唯一的顺序

ETC。,

以下是尝试 -

    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));

        }
    }

仍然缺少一些组合(看起来上面效率低下),你能建议我缺少什么吗?

4

2 回答 2

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]
            }
        }
     }
}

这将使数字无论顺序如何都是唯一的,我认为正确的术语是排列(这是排列)与组合。

于 2013-08-29T01:10:14.373 回答
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);
于 2013-08-29T01:58:28.230 回答