任何使我的代码高效循环 10 000 000 000 次的想法

  • 本文关键字:循环 代码 高效 任何使 java
  • 更新时间 :
  • 英文 :


我制作了一个简单的代码来计算给定数字"14"的出现次数。如果给定的数字是 10 000 000,我已成功打印出计数器,并且花费了不到 1 秒的时间。当我将数字增加到10 000 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

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

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

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

但是,您可能只能使用包含/排除原则计算案例数。

您可以通过结合 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();

最新更新