我正在尝试提交解决方案(使用一些具有编译时间限制的在线编译器)来排序数组 - 这是我的代码片段 -
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()
来获得最佳编译时间?
答案 0 :(得分:2)
您正在提交代码,然后在某处执行,这就是为什么您有 TIme Limit Exceeded 例外。
如果你禁用自动刷新,你没有得到这个例外的原因很简单,一旦你看看flush实际意味着什么。 flush
阻止您的代码并等待,直到写入流的所有内容都通过流到达目标(在本例中为System.out
)。
如果您启用了自动刷新功能,则会在每次println
命令后刷新。因此,在每个println
应用程序阻塞并等待Java VM或主机系统将您的字符串转发到System.out
之后。
如果您关闭了自动刷新功能,则println
的字符串会缓存在内存中。根据流的实现,它仍然可以尝试在后台刷新内存中的数据,但它不必。在您的应用程序结束时,您将立即写入所有字符串(通过flush
)。由于较少的上下文切换以及它不会阻止您的应用程序运行循环,因此速度更快。