我编写了一个简单的代码来计算给定数字中数字“ 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
答案 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();