Effectively print a long sequence
我要打印一个5和3的大序列数字(最多100000个整数)。我不把它存储在数组中,而是把它们的计数保存在noOfThrees和noOfFives中。
为简单起见,请拨打此号码x。.
因为我必须按顺序打印最大的数字,所以x最初是5,然后是3(如果没有5或3,我有打印的工作逻辑)
要打印号码,我使用这样的for循环:
1 2 3 4
| for(int i =0; i <noOfFives ; i ++)
System. out. print(5);
for(int i =0; i <noOfThrees ; i ++)
System. out. print(3); |
但是如果x是一个100000长的整数,那么在控制台上打印它需要4-5秒,这是不可取的。
我的拿手:
- 如果noOfFives是偶数,则在for循环中打印55,使性能提高x2,使循环增加2,否则
- 对循环使用与上面相同的方法。同样适用于noOfThrees。
但这里的问题是,如果它是奇数,它将再次以1的步骤结束打印。如何有效打印此序列?
- 这有什么实际用途?为什么你需要更快?
- @andyturner我正在解决一个在线判断的挑战,如果执行时间>4秒,会导致超时。
- 用位集代替简单的int怎么样?
- 如果它是在线判断的,它不会真正打印到控制台上。因为您没有刷新,所以输出将被缓冲;因此,以更大的块写入不会有太大的区别。
- @andyturner当我在我的机器上打印它时,大约需要4-5秒,我相信这就是导致超时的原因,因为它会覆盖所有测试用例,并导致其他测试用例超时。
- 如果将输出通过管道传输到/dev/null,则运行多长时间?
- 您可以尝试使用ApacheStringUtils填充5和3,而不是循环遍历它们。
- 输出字符串到系统输出的最快方法可能是什么?
- 您是否试图确保System.out得到缓冲?
如果您认为print调用的数量是问题所在,可以将其减少到1:将正确的3s和5s数量放入char数组,然后打印:
1 2 3 4
| char[] cs = new char[noOfFives + noOfThrees ];
Arrays. fill(cs, 0, noOfFives, '5');
Arrays. fill(cs, noOfFives, cs. length, '3');
System. out. print(cs ); |
您的问题似乎有点奇怪——我想知道让代码更快的逻辑方法是从其他地方查看这些值是如何计算的。
然而,我认为它将显著提高您的性能,首先在内存中构建字符串,然后打印它。
我还认为您应该看看为什么打印"B"比打印"B"慢得多?这可能会给你的问题提供一些有趣的线索。
我认为可以使用循环展开,这样可以减少循环的执行时间。例如:
有关更多详细信息,请访问https://en.wikipedia.org/wiki/loopunrolling
- 同样的,问题是System.out.print的数量,而不是循环的数量。