问题:返回一个二维整数数组中最大联通子数组的和
思路:把数按行分成几个一维数组,对于该一维数组,求出他们的最大连续数组之和,并且记录下最大连续数组的第一位和最后一位的位置,之后判断几个一维数组的最大连续数组的位置是否相接或包括(如,第一行是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