程序如何与测试平台沟通?

填函数风格

例题:最大和子矩阵牛客题霸牛客网 (nowcoder.com)

给定一个NxN矩阵mat和矩阵的阶数n,已知矩阵由正整数和负整数组成,请返回元素总和最大的子矩阵的元素之和。要求元素绝对值小于等于100000,尽量高效且矩阵阶数小于等于200。

测试样例:

[[1,2,-3],[3,4,-5],[-5,-6,-7]],3
返回:10
public class SubMatrix {
    public int sumOfSubMatrix(int[][] mat, int n) {
        // write code here
    }
}

在上面的初始代码中,给出了类名和方法名,这两部分是不能更改的。参数部分只要求个数一致即可。

image-20240706205201458

ACM风格

输入描述:
第一行有两个整数N,M。分别表示矩阵的行数/列数
接下来N行,每行M个整数表示矩阵内的数
输出描述:
输出一个整数表示答案

输入:
3 3
-90 48 78
64 -40 64
-81 -7 66 
输出:209 
image-20240706210353865

规定数据量

读取测试文件内容使用BufferedReader,因为如果使用Scanner的话,每次只能读取一行内容,BR可以一次读取多行(一块),减少IO次数,完成高效托管。

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

读取BR中的具体数据使用StreamTokenizer,其可以忽略所有的空格和回车,读出数据类型可以自定义。

StreamTokenizer in = new StreamTokenizer(br);

读取,直到文件结束:

while (in.nextToken() != StreamTokenizer.TT_EOF)

获取文件的行列数:

int n = in.nval;
in.nextToken();
int m = in.nval;

输出,汇报答案:(不使用SOUT也是因为效率低)

PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
out.println(maxSumSubmatrix(mat, n, m));

得到所有答案后:

out.flush();
br.close();
out.close();

使用全局静态空间而不是临时动态空间

在while循环中反复申请空间会导致空间复杂度上升,应该使用题目给出的边界条件下建立静态空间:

    //题目给定的行的最大数据量
    public static int MAXN = 201;

    // 题目给定的列的最大数据量
    public static int MAXM = 201;

    // 申请这么大的矩阵空间,一定够用了
    // 静态的空间,不停复用
    public static int[][] mat = new int[MAXN][MAXM];

    // 需要的所有辅助空间也提前生成
    // 静态的空间,不停复用
    public static int[] arr = new int[MAXM];

    // 当前测试数据行的数量是n
    // 当前测试数据列的数量是m
    // 这两个变量可以把代码运行的边界规定下来
    public static int n, m;
while (in.nextToken() != StreamTokenizer.TT_EOF) {
            n = (int) in.nval;
            in.nextToken();
            m = (int) in.nval;
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    in.nextToken();
                    mat[i][j] = (int) in.nval;
                }
            }
            out.println(maxSumSubmatrix());
        }
for (int i = 0; i < n; i++) {
            // 因为之前的过程可能用过辅助数组
            // 为了让之前结果不干扰到这次运行,需要自己清空辅助数组需要用到的部分
            Arrays.fill(arr, 0, m, 0);
            for (int j = i; j < n; j++) {
                for (int k = 0; k < m; k++) {
                    arr[k] += mat[j][k];
                }
                max = Math.max(max, maxSumSubarray());
            }
        }

按行读

题目不告知数据规模,此时应该使用BR的readLine()方法,由于没有ST的切割,我们需要自行分割并转换为数字:

while ((line = in.readLine()) != null) {
            parts = line.split(" ");//得到的是字符串数组
            sum = 0;
            for (String num : parts) {
                sum += Integer.valueOf(num);
            }
            out.println(sum);
        }
此作者没有提供个人介绍
最后更新于 2024-08-14