Java 通过组合并计算通过条件的人的方法

Java 通过组合并计算通过条件的人的方法,java,combinations,counting,Java,Combinations,Counting,我应该找到值0 1 2 3 4 5的每个5个数字组合,其中0不是第一个,一个数字的重复次数不超过1次。该方法将返回有效组合的数量 有效组合: 1 0 0 2 1 1 2 3 4 5 1 1 2 2 3 0 1 2 3 4 (0 cant be first) 2 3 3 3 5 (not allowed with 3 of the same digits) 0 1 2 3 4 5 (6 digit numbers not allowed) 无效组合: 1 0 0 2 1 1 2 3 4 5 1

我应该找到值0 1 2 3 4 5的每个5个数字组合,其中0不是第一个,一个数字的重复次数不超过1次。该方法将返回有效组合的数量

有效组合:

1 0 0 2 1
1 2 3 4 5
1 1 2 2 3
0 1 2 3 4 (0 cant be first)
2 3 3 3 5 (not allowed with 3 of the same digits)
0 1 2 3 4 5 (6 digit numbers not allowed)
无效组合:

1 0 0 2 1
1 2 3 4 5
1 1 2 2 3
0 1 2 3 4 (0 cant be first)
2 3 3 3 5 (not allowed with 3 of the same digits)
0 1 2 3 4 5 (6 digit numbers not allowed)

我对排列做了类似的工作,但我不太确定如何处理这个问题。正确答案是5100(我用数学方法解决了它)。

您只需要编写isValid函数并尝试以下伪代码

NB_SOLUTION = 0
FOR i = 0 ; i < 100000; i++
    If isValid(i)
        NB_SOLUTION ++
NB\u解决方案=0
对于i=0;i<100000;我++
如果有效(i)
铌铀溶液++
编辑:这就是我所做的,我发现的值与您发现的值相同

public static void computeExample() {
    int count = 0;
    for(int i = 0; i < 100000; i++) {
        if(isValid(i)) {
            count++;
        }
    }
    System.out.println(count);
}

public static int[] splitCiffers(int number) {
    int tmp = number;
    int unite = tmp % 10;
    tmp = (tmp - unite) / 10;
    int dizaine = tmp % 10;
    tmp = (tmp - dizaine) / 10;
    int centaine = tmp % 10;
    tmp = (tmp - centaine) / 10;
    int millier = tmp % 10;
    tmp = (tmp - millier) / 10;
    int dix_millier = tmp % 10;

    int[] retour = new int [5];
    retour[0] = dix_millier;
    retour[1] = millier;
    retour[2] = centaine;
    retour[3] = dizaine;
    retour[4] = unite;

    return retour;
}

public static boolean isValid(int number) {
    boolean isValid = true;
    int[] digitByDigit = splitCiffers(number);
    int[] digitAllowed = new int[6];
    for(int i = 0; i < 6; i++) {
        digitAllowed[i] = 0;
    }

    if(digitByDigit[0] == 0) {
        isValid = false;
    }

    for(int i = 0; i < 5; i++) {
        if(digitByDigit[i] < 0 || digitByDigit[i] > 5) {
            isValid = false;
        } else {
            digitAllowed[digitByDigit[i]]++;
        }
    }
    for(int i = 0; i < 6; i++) {
        if(digitAllowed[i] > 2) {
            isValid = false;
        }
    }
    return isValid;
}
publicstaticvoidcomputeExample(){
整数计数=0;
对于(int i=0;i<100000;i++){
如果(i)有效{
计数++;
}
}
系统输出打印项次(计数);
}
公共静态int[]拆分域(int编号){
int tmp=数字;
int unite=tmp%10;
tmp=(tmp-联合)/10;
int dizaine=tmp%10;
tmp=(tmp-地嗪)/10;
int centaine=tmp%10;
tmp=(tmp-百分丹)/10;
int millier=tmp%10;
tmp=(tmp-millier)/10;
int dix_millier=tmp%10;
int[]retour=新int[5];
retour[0]=dix_millier;
retour[1]=millier;
retour[2]=百分丹;
retour[3]=地扎因;
retour[4]=联合;
回归回归;
}
公共静态布尔值isValid(整数){
布尔值isValid=true;
int[]digitByDigit=拆分域(数字);
int[]digitAllowed=新int[6];
对于(int i=0;i<6;i++){
digitAllowed[i]=0;
}
if(digitByDigit[0]==0){
isValid=false;
}
对于(int i=0;i<5;i++){
if(digitByDigit[i]<0 | | digitByDigit[i]>5){
isValid=false;
}否则{
digitAllowed[digitByDigit[i]]++;
}
}
对于(int i=0;i<6;i++){
如果(数字降低[i]>2){
isValid=false;
}
}
返回有效;
}

问题出在哪里?你已经在一张纸上计算过了,把计算结果翻译成代码我觉得这更像是一个数学相关的问题。不管怎样,您是应该在输入中找到有效的模式,还是只输出可能的不同组合的数量?谢谢您的快速回复。从数学上解决这个问题相当容易,但在我的任务中,我被指定要遍历所有可能的组合,只计算通过条件的组合,并返回该数字。这是我在纸上没有做过的事。我不能把我的头放在遍历所有组合的算法上,这就是我的问题所在(我想)我想你想得太多了。您有5个数字,有6个不同的CIFFER。使用一个for循环,您可以从0到100000浏览所有可能的内容,然后检查每个数字是否有效。如果只想检查包含数字的数字,则可以使用从0到5的5嵌套for循环。每个循环代表一个数字。我理解这一点,我必须循环通过解决方案,只考虑那些有效的。但是我从哪里开始呢?是否有任何方法可以给我下一个组合?首先,您必须声明并定义isValid方法:public boolean isValid(int number);检查编辑的版本,以及详细的解决方案。更难的是将数字分成不同的CIFFER!