计算N个数字系列中的零 - Java

时间:2014-02-27 10:21:34

标签: java regex

我想计算从0开始的 N 范围内的零个数。

如果 N 100 表示,则范围应从 0到100 开始,然后计数应为 12

下面的代码可以使用 10 ^ 6

private static int calcZeros(String input){
        int count = 0;

        int n = Integer.parseInt(input);
        for(int i = 0;i<=n;i++){
            count += String.valueOf(i).replaceAll("[a-zA-Z_1-9]","").trim().length(); 
        }
        return count;
    }

如果 N 超过 10 ^ 6 ,它就会挂起,很明显,循环运行的时间很长。

我的问题是,这是找到零计数的正确方法吗?

建议我做一些最快的计算方法。

4 个答案:

答案 0 :(得分:1)

这是(半)组合问题。

例如想象4位数字:

我们开始找到一个零的所有数字。

在第一个位置(从左到右),您可以使用1-9,然后是1-9,然后是1-9的数字,然后会有0,所以没有其他选项。

其9 * 9 * 9的可能性。

零点可以分三个位置。

然后我们必须找到所有带有两个零的4位数字。

我们可以使用二项式系数,在我们的情况下,(n k)将是n=number of digits - 1k = number of zeroes,然后将它乘以9 * 9,因为这是其他数字的所有可能性。< / p>


我现在必须走了,所以我不能为任何可能的数字完成它,但是对于给定的位数,这个应该是有效的:

public static void main(String[] args) {
    System.out.println(numberZeroes(2));
}

public static int numberZeroes(int digits) {
    int result = 0;
    for (int i = 1; i <= digits - 1; i++) {
        result += binomial(digits - 1, i) * Math.pow(9, digits - i);                        
    }

    return result+1;
}

public static int binomial(final int N, final int K) {
    BigInteger ret = BigInteger.ONE;
    for (int k = 0; k < K; k++) {
        ret = ret.multiply(BigInteger.valueOf(N - k))
                .divide(BigInteger.valueOf(k + 1));
    }
    return ret.intValue();
}

答案 1 :(得分:0)

不是使用字符串和正则表达式,而是将速度除以10会快得多 - 例如:

int i = 96;
int firstDigit = i / 10;
int secondDigit = i - firstDigit * 10;

对于任意大数字,您只需要用while循环替换它。

答案 2 :(得分:0)

此算法在20秒内计算零到1000000000的零数。我希望它有所帮助。

int count = 0;
int n = 1000000000;
for (int i = 0; i <= n; i++) {
    int m= i;
    do {
        if (m % 10 == 0)
            ++count;

        m = m / 10;
    } while (m > 0);
}
System.out.println("count = " + count);

答案 3 :(得分:0)

试试这个

int n = 1000000;
int count  = 0 ;
Pattern pattern = Pattern.compile("0+");

for(int i = 0; i <= n ; i++ ) {
    Matcher m = pattern.matcher(String.valueOf(i));
    while (m.find()) {
        count += m.group().length();
    }
}
System.out.println(count);