2015-11-04 81 views
0

我要打印一個數字,這是一個5和3(最多100,000個整數)的巨大序列。我只是將它們保存在noOfThreesnoOfFives之內,而不是將其存儲在數組中。有效地打印一個長序列

爲簡單起見,請致電此號碼x。 。

由於我必須打印序列中的數量最多,x將是最初5的再接着用3的(I有工作邏輯打印如果沒有5的或無3'S)

要打印的數量,我使用一個循環是這樣的:

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長整型數,大約需要4-5sec到打印在控制檯這是不可取的。

我的看法:

  • 如果noOfFives爲偶數,則兩個打印55在for循環,其通過X2提高了性能並增加循環,否則
  • 使用相同的環的上述。 noOfThrees也一樣。

但這裏的問題是,如果它很奇怪,它將再次以1爲步驟結束打印。如何有效打印此序列?

+0

這有什麼實際用途?你爲什麼需要它更快? –

+0

@AndyTurner如果執行時間大於4秒,會導致超時的在線裁判解決一個挑戰 –

+0

[BitSet]怎麼樣(http://docs.oracle.com/javase/7/docs/api/java/util /BitSet.html)而不是一個簡單的'int'? – SomeJavaGuy

回答

4

如果你認爲的print調用次數是問題,你可以減少它只是1:把三分球權數, 5s轉換爲字符數組,然後打印:

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

你的問題似乎有點奇怪 - 我想知道讓你的代碼更快的邏輯方法是看別處如何計算這些值。

但是,我認爲這將顯着提高您的性能,首先在內存中建立字符串,然後打印它。

我也認爲你應該看看Why is printing "B" dramatically slower than printing "#"?這可能會對你的問題提出一些有趣的看法。

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

+1

在所有可能的情況下,'System.out.print'的數量是問題,而不是循環的數量。 – Keppil