Java 有什么办法可以让我的代码循环10000次
我制作了一个简单的代码来计算给定数字中数字“14”的出现次数。如果给定的数字是10000,并且不到1秒,我就成功地打印出了计数器。当我把数字增加到 10 000 000这花了459秒。有没有办法让它跑得更快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
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秒