2014-11-21 42 views
1

我想提出的解決方案(使用一些網上的編譯器編譯有時間限制),在這裏整理的陣列 - 是我的代碼snippet-運行輸出流的flush()的時間

class TSORT { 
    public static void main(String[] args) throws IOException{ 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     PrintWriter bw = new PrintWriter(System.out, false); 
     int t = Integer.parseInt(br.readLine()); 
     int[] list = new int[1000001];  
     for(int i = 0; i < t; i++){ 
      int n = Integer.parseInt(br.readLine()); 
      list[n]++; 
     } 
     int r=0; 
     for(int i = 0; i < 1000001; i++){ 
      if(list[i] > 0){ 

       for(int j = 0; j < list[i]; j++){ 
        bw.println(i);  // if I use bw.flush() here, time limit gets exceeded. 

       } 
      } 
    } 
     bw.flush(); 
    } 
} 

此代碼已成功提交,但如果我使用flush()作爲true(自動刷新-new PrintWriter(System.out, true);),編譯器將顯示TIME LIMIT EXCEEDED。

我的問題是 - 我應該如何使用flush()來獲得最佳編譯時間?

+1

什麼編譯時間可能與刷新'PrintStream'有關? – 2014-11-21 13:57:44

回答

2

您正在提交代碼,然後在某處執行,這就是爲什麼您有TIme Limit Exceeded例外。

如果您禁用自動刷新功能,您不會得到此異常的原因很簡單,只要您查看實際的刷新方式即可。 flush會阻止您的代碼並等待,直到寫入到流中的所有內容也都通過流到達目標(在本例中爲System.out)。

如果您打開了自動沖洗功能,它會在每次執行println命令後刷新。因此,在每個println之後,您的應用程序將阻止並等待Java VM或主機系統將您的字符串轉發到System.out

如果您關閉了自動沖洗功能,則將println的字符串緩存在內存中。根據流的實現,它仍然可以嘗試從後臺清除內存中的數據,但不一定要這樣做。在您的應用程序結束時,您將一次寫入所有字符串(通過flush)。由於較少的上下文切換以及它不會鎖定應用程序以避免運行循環,所以速度更快。

+0

是的!打印流(System.out.println())也是如此。謝謝! – user3788040 2014-11-21 14:19:38

相關問題