有效地打印长序列

时间:2015-11-04 07:14:06

标签: java algorithm

我打印的数字是5和3(最多100,000英尺)的巨大序列。我没有将其存储在数组中,而是将其计算在noOfThreesnoOfFives

为简单起见,请拨打此号码x

由于我必须在序列中打印最大的数字,x最初将是5'然后是3&#(我有工作逻辑可以打印,如果有的话)没有5或没有3'

要打印号码,我正在使用这样的for循环:

for(int i=0; i<noOfFives; i++) 
    System.out.print(5);
for(int i=0; i<noOfThrees; i++)
    System.out.print(3);

但是如果x是一个100,000长的int数,那么在控制台上打印它需要大约4-5秒,这是不可取的。

我的看法:

  • 如果noOfFives是偶数,则在for循环中打印55,将性能提高x2并将循环增加2,否则
  • 使用与上面相同的循环。同样适用于noOfThrees

但问题在于它是否奇怪,它将再次以1的步骤打印。如何有效地打印此序列?

3 个答案:

答案 0 :(得分:4)

如果您认为问题的数量是print,那么您可以将其减少到1:将正确数量的3和5放入char数组中,然后打印出来:

char[] cs = new char[noOfFives + noOfThrees];
Arrays.fill(cs, 0, noOfFives, '5');
Arrays.fill(cs, noOfFives, cs.length, '3');
System.out.print(cs);

答案 1 :(得分:1)

您的问题似乎有点奇怪 - 我想知道让代码更快的合理方法是在其他地方查看如何计算这些值。

但是我认为首先在内存中构建字符串然后打印它会显着提高性能。

我还认为你应该看看Why is printing "B" dramatically slower than printing "#"?,这可能会对你的问题有所启发。

答案 2 :(得分:0)

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

    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/Loop_unrolling