我制作了一个简单的代码来计算给定数字"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();