问题:返回一个二维整数数组中最大联通子数组的和

思路:把数按行分成几个一维数组,对于该一维数组,求出他们的最大连续数组之和,并且记录下最大连续数组的第一位和最后一位的位置,之后判断几个一维数组的最大连续数组的位置是否相接或包括(如,第一行是1和4,第二行是3和5,这样就相连)。最后在加上没有包括的正数(必须在上一行的最大连续数组的第一位和最后一位的位置之间)。输出之前之和就行。

一、实现代码

该实验是在IDEA中完成的,一下为待测试的代码。

package test;
import java.io.IOException;

import
java.util.ArrayList; import java.util.Collections; import java.util.List; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; public class MaxIntArray { public static void main(String[] args) throws IOException { Integer[][] c=new Integer[100][];      //从文件读出二维数组 c=ReadFile("C:\\Users\\36072\\Desktop\\arr.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("MaxSUM:"+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);//将数据转化为int类型 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 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=new Integer[]{-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].intValue(); 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]; } }

二、单元测试

2.1 测试环境搭建

完成项目的创建后,点击 文件File-设置Settings-Plugins 在搜索栏搜索 JUnit,此时出现了几个Plugins,选择 JUnit。

 

 2.2 创建测试代码

直接选择要测试的类,然后按Ctrl+Shift+t。

 

要注意的是,选横排放置的,不要在文件里选择,否则会没有反应。

正确操作后会出现如下窗口:

 

然后选择Creat New Test。

接下来就是开始编写测试代码了。生成的测试文件,如果有错,根据提示改就行。

这里我写了四个测试数据。

测试代码:

package test;

import org.junit.Test;

import static org.junit.Assert.*;
import static test.MaxIntArray.GetMaxSUM;
import static test.MaxIntArray.MaxSUM;
import static test.MaxIntArray.ReadFile;

public class MaxIntArrayTest {

    @Test
    public void test1() {
        String str="C:\\Users\\36072\\Desktop\\arr1.txt";
        Integer[][] c=ReadFile(str);
        System.out.println("MaxSUM:"+GetMaxSUM(c));
    }
    @Test
    public void test2() {
        String str="C:\\Users\\36072\\Desktop\\arr2.txt";
        Integer[][] c=ReadFile(str);
        System.out.println("MaxSUM:"+GetMaxSUM(c));
    }
    @Test
    public void test3() {
        String str="C:\\Users\\36072\\Desktop\\arr3.txt";
        Integer[][] c=ReadFile(str);
        System.out.println("MaxSUM:"+GetMaxSUM(c));
    }
    @Test
    public void test4() {
        String str="C:\\Users\\36072\\Desktop\\arr4.txt";
        Integer[][] c=ReadFile(str);
        System.out.println("MaxSUM:"+GetMaxSUM(c));
    }

}

测试结果:

 

三、单元测试/代码覆盖率

使用IDEA自带的代码覆盖率工具

3.1 查看配置(因为都是默认的,所以不用修改)

 点击Edit Configurations

 

 点击上方的设置图标用以修改整个Junit的配置,或者也可以点击具体的单元测试文件来修改该文件的配置。

 

 默认方式是IntelliJ IDEA。

 

 3.2 测试

选择想要测试的单元测试文件或者文件夹,右键Run with Coverage。

 

 成功后会出现统计信息。

 

四、问题及解决方法

问题1:由于是参考的C++代码,而实现使用的java导致了空指针问题。C是支持&取地址的,但是java不行,导致调试过程一直报空指针问题。最后将需要取地址的基本数据类型换成了对象才实现了对象的引用。即形参改变,实参也相应改变。

五、参考资料:

单元测试:https://blog.csdn.net/weixin_44425934/article/details/99858528

覆盖率:https://blog.csdn.net/xwj1992930/article/details/98212905

posted on 2021-03-29 19:51  琋瑒  阅读(133)  评论(1)    收藏  举报