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

一、问题

以指定格式的文本文件形式输入数组并将数组由一维变为二维。给出单元测试/代码覆盖率的最终覆盖率的报告。

二、代码实现

MaxIntArray.java

 

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\\Administrator\\Desktop\\1.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.print(c[2][2]);
        System.out.println("1:"+GetMaxSUM(c));
//        System.out.println("2"+MaxSUM(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类型
//            System.out.println(lines);

            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(" ");//按空格进行分割
//                System.out.println("Length:"+sp.length);
//                System.out.println("sp:"+sp[0]);
                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]);
//                    System.out.print(cc[i][j]+" ");
                }
//                System.out.println();
            }
            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=new Integer[100];
        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];
    }
}

 

 

MaxIntArrayTest.java

 

package test;

import org.junit.Test;

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

public class MaxIntArrayTest {

    @Test
    public void test1() {
        String str="C:\\Users\\Administrator\\Desktop\\1.txt";
        Integer[][] c=ReadFile(str);
        System.out.println(GetMaxSUM(c));
    }

}

 

三、单元测试结果

 

 

 

 

 

 

 

 四、代码覆盖率

是软件测试中的一种度量,描述程序中源代码被测试的比例和程度,所得比例称为代码覆盖率。在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。

代码覆盖率 = 代码的覆盖程度,一种度量方式。

以下为进行测试后所得到的代码覆盖范围以及覆盖率。

 

 

 

 

 

 五、总结

1.分析未覆盖部分的代码,从而反推在前期测试设计是否充分,没有覆盖到的代码是否是测试设计的盲点,之后进行补充测试用例设计。

2.检测出程序中的废代码,可以逆向反推在代码设计中思维混乱点,提醒我理清代码逻辑关系,提升代码质量。

3.代码覆盖率高不能说明代码质量高,但是反过来看,代码覆盖率低,代码质量不会高到哪里去,可以作为测试自我审视的重要工具之一。

4.覆盖率数据只能代表你测试过哪些代码,不能代表你是否测试好这些代码。不能盲目追求代码覆盖率,而应该想办法设计更多更好的案例,哪怕多设计出来的案例对覆盖率一点影响也没有。

posted @ 2021-03-31 15:04  霜烬  阅读(82)  评论(3)    收藏  举报