用Java刷OJ超时怎么办?原因分析及解决方式
Java超時原因?
又是Java超時。
PAT不給Java延時,簡直欺負Java選手。因為Java本身底層的一些原因,編譯、運行起來會比其他語言慢一些。有很多其他OJ都放寬Java時間限制了。
以后除非特殊情況(比如大數計算,用Java開掛),不用Java做題了…
那為啥PAT不放寬Java時間限制?
也可能是因為JDK提供的現成的方法太多、容易偷懶,而語言只是工具,重要的是算法。
可能PAT希望考試更加公平,避免因為語言不同而造成的便捷,避免大家因為過多的依賴語言的特性,而忽略了算法設計的重要性。畢竟,如果已有JDK寫好的方法的話,就不用重復造輪子了。
超時怎么解決?
1、用BufferedReader替換Snanner作為輸入
2、一般對于100ms時間限制的題目,基本ac不了,哪怕優化得再好。因為很多乙級題目運行時長(該死的jvm啟動)在100ms上下,運氣好ac的多,運氣差全超時!
3、200ms以上的題目,若是運行超時,那就請不要用暴力破解。
4、如果還是超時的話,建議換語言。官方說明:選擇合適的語言也是一種技巧,所以不給你java放寬時間限制!
附:官方說明
- PTA官網提交界面的“幫助”給出的常見問題解答如下
*我應該從哪里讀輸入,另外應該輸出到哪里?
如果沒有特別說明,你的程序應該從標準輸入(stdin,傳統意義上的“鍵盤”)讀入,并輸出到標準輸出(stdout,傳統意義上的“屏幕”),不要使用文件做輸入輸出。由于系統是在你的程序運行結束后開始檢查輸出是否是正確的,對于有多組測試數據的輸入,可以全部讀入之后再輸出,也可以處理一組測試數據就輸出一組。
*為什么提交后彈出的窗口一直顯示“等待評測”?
提交后即刻彈出的窗口不會自動更新狀態。如果看到“等待評測”,請關閉該窗口,去“提交列表”中找到自己的提交,點擊分數鏈接,即可查看詳細結果。
*為什么我的程序交在這里得到編譯錯誤,而我在自己的機器上已經編譯通過了?
本系統所使用的編譯器和你在自己機器上使用的可能有區別,請留意幾個常見的地方:
本系統是 64 位 Linux 系統,使用的編譯器版本和編譯參數可以參見編譯器幫助
Java 代碼需使用 Main 作為主類名
Visual C++ 6.0 和 Turbo C++ 3.0 (及它們的更低版本)有較多違背 C++ 標準(ISO/IEC 14882)的地方,不要使用它們來判斷 C++ 程序語法上是否有問題
C++ 下 64 位整數的類型是 long long,不要使用 __int64
*為什么我的程序得到了“非零返回”?
返回零表示一個程序正常結束,如果沒有返回零,則系統認為程序沒有正常結束,這時即便輸出了正確的內容也不予通過。
C 或 C++ 代碼請確認 int main 函數最終會返回 0,不要聲明為 double main 或者 void main
有異常的語言,請確認程序處理了可能拋出的異常
*程序的時間和內存占用是如何計算的?
程序的運行時間為程序在所有 CPU 核占用的時間之和,內存占用取程序運行開始到結束占用內存的最大值。
*為什么同樣的程序運行時間和所用內存會不同?
程序運行時間會受到許多因素的影響,尤其是在現代多任務操作系統以及在使用動態庫的情況下,多次使用同一輸入運行同一程序所需時間和內存有一些不同是正常現象。我們的題目給出的運行限制一般為標準程序的若干倍,也就是說,選用正確的算法和合適的語言,那么運行限制是富余的。
*不同語言的時間限制和內存限制是相同的嗎?
是相同的,我們認為選擇合適的編程語言也是一項必備技能,所以沒有為不同語言設置不同的限制條件。
*我提交的代碼可以做什么,有什么限制嗎?
沒有。這里沒有系統調用白名單,也沒有針對語言限制可使用的包或庫。雖然我們比較寬容大度,但還是請不要做不符合道義的事情。如果你需要使用我們系統沒有提供的某個語言的某個庫,或者需要更改編譯參數,可以聯系我們。
最后,紀念又一次Java超時的代碼
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.List;public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String str1 = br.readLine();if (str1.length() == 0)return;String str2 = br.readLine();if (str2.length() == 0){System.out.println(str1);return;}String[] arr = str2.split("");for (int i = 0; i < arr.length; i++) {str1 = str1.replaceAll(arr[i], "");}System.out.println(str1);} }總結
以上是生活随笔為你收集整理的用Java刷OJ超时怎么办?原因分析及解决方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java设计模式】建造者模式、原型模式
- 下一篇: java美元兑换,(Java实现) 美元