ACM使用Java提交总是超时的解决方法
转载自作者:日沉云起
链接:https://blog.csdn.net/richenyunqi/article/details/84350768
来源:CSDN
当你发现代码相同,c++ 和 Java分别提交,c++通过了而Java却没有,那就是因为以下三种情况了:
不能使用Scanner输入
- 用BufferReader类和StringTokenizer类代替Scanner类来读取输入,读取输入的语法如下:
class Reader { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer tokenizer = new StringTokenizer(""); // 读取下一行字符串 static String nextLine() throws IOException { return br.readLine(); } // 读取下一个字符串 static String next() throws IOException { while (!tokenizer.hasMoreTokens()) { tokenizer = new StringTokenizer(br.readLine()); } return tokenizer.nextToken(); } static int nextInt() throws IOException { return Integer.parseInt(next()); } static double nextDouble() throws IOException { return Double.parseDouble(next()); } static BigInteger nextBingInteger() throws IOException { return new BigInteger(nextLine(), 10); } }
举例
poj(北京大学程序在线评测系统)的第2479DP题,使用Scanner总是超时,换成上面的方式直接AC。代码:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class P2479_MaximumSum { public static void main(String[] args) throws IOException { int t = Reader.nextInt(); int sum, i; for (i = 0; i < t; i++) { int n = Reader.nextInt(); int[] arr = new int[n]; for (i = 0; i < n; i++) { arr[i] = Reader.nextInt(); } int[] larr = new int[n]; int[] rarr = new int[n]; larr[0] = arr[0]; rarr[n - 1] = arr[n - 1]; for (i = 1, sum = arr[0]; i < n - 1; i++) { sum = Math.max(sum + arr[i], arr[i]); larr[i] = Math.max(sum, larr[i - 1]); } int max = rarr[n - 1] + larr[n - 2]; for (i = n - 2, sum = arr[n - 1]; i > 0; i--) { sum = Math.max(sum + arr[i], arr[i]); rarr[i] = Math.max(sum, rarr[i + 1]); max = Math.max(rarr[i] + larr[i - 1], max); } System.out.println(max); if (i != 0) System.out.println(); // 题目要求每个案例后都有一个空行,注意ps:只有一个案例时,不需要空行 } } } class Reader { static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer tokenizer = new StringTokenizer(""); static String nextLine() throws IOException {// 读取下一行字符串 return reader.readLine(); } static String next() throws IOException {// 读取下一个字符串 while (!tokenizer.hasMoreTokens()) { tokenizer = new StringTokenizer(reader.readLine()); } return tokenizer.nextToken(); } static int nextInt() throws IOException {// 读取下一个int型数值 return Integer.parseInt(next()); } static double nextDouble() throws IOException {// 读取下一个double型数值 return Double.parseDouble(next()); } }
操作字符串
当需要对String字符串增添或删除字符时,用StringBuilder或StringBuffer类来替代String类。由于StringBulider速度比StringBuffer快,所以StringBulider在OJ比赛中更常用。Java中,String对象是不可变的,所以利用+会建立一个新字符串对象,这是十分费时的,而StringBuilder或StringBuffer类对象是可变的,可以添加、删除和修改字符。
StringBuilder的常用方法如下:
//建立一个空StringBuilder对象 StringBuilder s=new StringBuilder(); //建立一个初始化为“0000”字符串的StringBuilder对象 StringBuilder s1=new StringBuilder("0000"); //在StringBuilder对象尾部添加"0000"字符串 s.append("0000"); //在StringBuilder对象的0号索引位置之前添加"1111"字符串 s.insert(0,"1111"); //修改StringBuilder对象5号索引位置的字符为'A'字符 s.setCharAt(5, 'A'); //将StringBuilder对象转换为字符串 String s3=s.toString();
遍历字符串
当需要访问字符串中的某个字符或需要遍历整个字符串的每一个字符时,先用toCharArray()方法将String转换为char数组,再进行遍历,不要使用String的CharAt方法。
致力于记录学习过程中的笔记,希望大家有所帮助(*^▽^*)!