程序如何与测试平台沟通?
填函数风格
例题:最大和子矩阵牛客题霸牛客网 (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
}
}
在上面的初始代码中,给出了类名和方法名,这两部分是不能更改的。参数部分只要求个数一致即可。
ACM风格
输入描述:
第一行有两个整数N,M。分别表示矩阵的行数/列数
接下来N行,每行M个整数表示矩阵内的数
输出描述:
输出一个整数表示答案
输入:
3 3
-90 48 78
64 -40 64
-81 -7 66
输出:209
规定数据量
读取测试文件内容使用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);
}
Comments NOTHING