任何使我的代码有效循环1亿次的想法

时间:2019-06-14 10:31:32

标签: java

我编写了一个简单的代码来计算给定数字中数字“ 14”的出现次数。如果给定的数字为1 000 000,并且用时不到1秒,则我已经成功打印出计数器。当我增加到 10 000 000耗时459秒。关于如何使其运行更快的任何想法?

long startTime = System.nanoTime();
        long counter = 0L;
        for (long i = 14; i <= 10000000000L; i++)
        {
            String s = Long.toString(i);//i.ToString();
            if (s.contains("14"))
            {
                counter += 1;
            }

        }
        long endTime   = System.nanoTime();
        long totalTime = endTime - startTime;
        long convert = TimeUnit.SECONDS.convert(totalTime, TimeUnit.NANOSECONDS);

        System.out.println(convert + " seconds");
        System.out.println(counter);

耗时:459秒
出现的14个数字:872348501

2 个答案:

答案 0 :(得分:3)

最明显的优化:不要构造字符串。

只需检查数字的最后两位,然后除以10,直到找到14:

boolean matches = false;
for (long num = i; num >= 14 && !matches; num /= 10) {
  matches = (num % 100) == 14;
}
if (matches) {
  counter += 1;
}

但是,您可能可以使用包含/排除原理来计算案件数。

答案 1 :(得分:2)

您可以通过结合Andy Turner提出的解决方案和java8并行流来提高性能:

private boolean twoDigitExist(long x, long d) 
    { 
        while (x >= d) 
        { 
            if (x % 100 == d) 
                return true;
            x /= 10; 
        } 
        return false;
    }

并且循环可以并行化为:

long counter = LongStream.range(14, 10000000000L).parallel().filter(l->twoDigitExist(l, 14)).count();