二维数组中最大子数组之和

一、题目

1.1 要求

1,以指定格式的文本文件形式输入数组。

2,数组由一维变为二维。

3,熟练使用git常用命令将作业签入代码版本控制平台。

1.2 代码

package test;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
 
public class Calculate {
 
    public static void main(String[] args) throws IOException {
 
        Integer[][] c = new Integer[100][];
 
        c = ReadFile("C:\\Users\\Administrator\\Desktop\\my.txt");
        for (int i = 0; i < c.length; i++) {
            for (int j = 0; j < c[0].length; j++) {
                System.out.print(c[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println("max:" + GetMaxSUM(c));
       
    }
 
    public static Integer[][] ReadFile(String str) {
        FileReader file = null;
 
        try {
            file = new FileReader(str);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println("文件测试数据如下:");
        BufferedReader br = new BufferedReader(file);// 读取文件
        try {
            String line = br.readLine();//读取一行数据
            int lenx = Integer.parseInt(line);// 将数据转化为int类型
            line = br.readLine();
int leny = Integer.parseInt(line); String[] sp = null; String[][] c = new String[lenx][leny]; Integer[][] cc = new Integer[lenx][leny]; int count = 0; while ((line = br.readLine()) != null) {// 按行读取 sp = line.split(" ");// 按空格进行分割 for (int i = 0; i < sp.length; i++) { c[count][i] = sp[i]; } count++; } for (int i = 0; i < lenx; i++) { for (int j = 0; j < leny; j++) { cc[i][j] = Integer.parseInt(c[i][j]); } } return cc; } catch (IOException e) { e.printStackTrace(); } return null; } public static int GetMaxSUM(Integer[][] a) { int n = a.length; int m = a[0].length; // 分块 Integer[] Max = new Integer[100]; Integer[] Begin = new Integer[100]; Integer[] End = new Integer[100]; Integer[] b = new Integer[100]; for (int i = 0; i < n; i++) { // 按行分组 for (int j = 0; j < m; j++) { b[j] = a[i][j]; } MaxIntArray(b, Max, Begin, End, m, i); } int max = Max[0]; for (int i = 0; i < n - 1; i++) { if ((Begin[i] <= End[i + 1] && Begin[i] >= Begin[i + 1]) || (End[i] <= End[i + 1] && End[i] >= Begin[i + 1])) { max = Max[i + 1] + max; } else { // 如果不能直接连通,判断代价是否合适 if (Begin[i] > End[i + 1]) { int t = Begin[i] - End[i + 1]; int s = Begin[i]; int temp = 0; for (int k = 0; k < t; k++) { temp += a[i + 1][s - k]; } if (temp + Max[i + 1] > 0) max = temp + Max[i + 1]; } if (End[i] < Begin[i + 1]) { int t = Begin[i + 1] - End[i]; int s = End[i]; int temp = 0; for (int k = 0; k < t; k++) { temp += a[i + 1][s + k]; } if (temp + Max[i + 1] > 0) max = temp + Max[i + 1]; } } } return max; } public static void MaxIntArray(Integer[] a, Integer[] max, Integer[] begin, Integer[] end, int n, int index) { Integer[] Max = new Integer[100]; Max[0] = 0; int i = 0;// 数组下标 int j = 0;// 最大值数组下标 int temp = 0;// 中间变量 // 记录子数组的起始位置和末位 Integer[] Bg = { -1, -1, -1, -1, -1 }; Integer[] Ed = new Integer[100]; while (i < n) { if (temp + a[i] >= Max[j]) { temp = temp + a[i]; Max[j] = temp; if (Bg[j] == -1) Bg[j] = i; Ed[j] = i; i++; } else if (temp + a[i] < Max[j] && temp + a[i] > 0) { temp = temp + a[i]; i++; } else if (temp + a[i] <= 0) { i++; j++; Max[j] = 0; temp = 0; } } max[index] = Max[0]; int q = 0; for (int k = 0; k <= j; k++) { if (Max[k] > max[index]) { max[index] = Max[k]; q = k; } } begin[index] = Bg[q]; end[index] = Ed[q]; } }

 

1.3 结果

my.txt数据如下:

 

运行结果如下:

 

 

二、单元测试

package test;

import static org.junit.Assert.*;
import org.junit.Test;

public class CalculateTest {

    @Test
    public void test1() {
        String str="C:\\Users\\Administrator\\Desktop\\my1.txt";
        Integer[][] c=Calculate.ReadFile(str);
        System.out.println("MaxSUM:"+Calculate.GetMaxSUM(c));
    }
    @Test
    public void test2() {
        String str="C:\\Users\\Administrator\\Desktop\\my2.txt";
        Integer[][] c=Calculate.ReadFile(str);
        System.out.println("MaxSUM:"+Calculate.GetMaxSUM(c));
    }
   
    @Test
    public void test4() {
        String str="C:\\Users\\Administrator\\Desktop\\my4.txt";
        Integer[][] c=Calculate.ReadFile(str);
        System.out.println("MaxSUM:"+Calculate.GetMaxSUM(c));
    }

}

测试结果

三、代码覆盖率

总体代码覆盖率

 

 

 

 

 

 

 

 

 

 绿色:代码被执行过 黄色:代码部分被执行过 红色:代码没有被执行过

分析:类的覆盖率为100%,方法的覆盖率为40%,行的覆盖率为8%。

总结

通过Eclipse插件可以快速验证测试用例的代码覆盖率,在大型项目中,合格的测试用例覆盖率能够很好的减少因临时修改代码而导致的重大BUG,但不建议盲目追求代码覆盖率,尤其是中小型项目。

posted @ 2021-03-31 18:05  aoao2239  阅读(46)  评论(3)    收藏  举报