遍历组合并计算通过条件

时间:2015-09-21 09:38:35

标签: 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)

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

1 个答案:

答案 0 :(得分:-1)

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

NB_SOLUTION = 0
FOR i = 0 ; i < 100000; i++
    If isValid(i)
        NB_SOLUTION ++

编辑:这就是我所做的,我发现你找到的价值相同。

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