关于Java:有效打印一个长序列

Effectively print a long sequence

我要打印一个5和3的大序列数字(最多100000个整数)。我不把它存储在数组中,而是把它们的计数保存在noOfThreesnoOfFives中。

为简单起见,请拨打此号码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的步骤结束打印。如何有效打印此序列?


如果您认为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"慢得多?这可能会给你的问题提供一些有趣的线索。


我认为可以使用循环展开,这样可以减少循环的执行时间。例如:

1
2
3
4
5
6
7
    for(int i=0; i<noOfFives; i+=5) {
        System.out.print(5);
        System.out.print(5);
        System.out.print(5);
        System.out.print(5);
        System.out.print(5);
    }

有关更多详细信息,请访问https://en.wikipedia.org/wiki/loopunrolling