Java 有什么办法可以让我的代码循环10000次

Java 有什么办法可以让我的代码循环10000次,java,Java,我制作了一个简单的代码来计算给定数字中数字“14”的出现次数。如果给定的数字是10000,并且不到1秒,我就成功地打印出了计数器。当我把数字增加到 10 000 000这花了459秒。有没有办法让它跑得更快 long startTime = System.nanoTime(); long counter = 0L; for (long i = 14; i <= 10000000000L; i++) { String s

我制作了一个简单的代码来计算给定数字中数字“14”的出现次数。如果给定的数字是10000,并且不到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);
long startTime=System.nanoTime();
长计数器=0L;

对于(长i=14;i最明显的优化:不要构造字符串

只需检查数字的最后两位,然后除以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 parallel streams提出的解决方案来提高性能:

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();

我所说的“14”的出现是这样的:有20个数字包含1到1000之间的14。(14、114、140、141、142、143、144、145、146、147、148、149、214、314、414、514、614、714、814、914)简单的不计算,而是生成所有可能的大小写。我不喜欢为循环读取它们。为什么不
if(匹配){counter++;break;}
?尝试了你的代码伴侣,它比我的代码快了很多,但仍然需要192秒。有可能使它不到1秒吗?@KevinHelma是的。但我猜这是某种编码挑战,所以如果你刚刚得到答案,你的乐趣何在:)提示,使用记忆。不可能少于1秒。在我的笔记本电脑上,只有一个包含你提供的数字的空循环需要6秒以上。即使处理器能够在每个时钟周期内执行一次循环迭代(我认为这是不可能的),您需要一个10GHz处理器,才能在1秒内实现循环。@Tobb使用此算法是不可能的。但是,这是可能的。thx mate,以您的方式尝试,它缩短为66秒