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方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM