用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);
	}
}

在这里插入图片描述

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值