2014-11-21 65 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