zoukankan      html  css  js  c++  java
  • 软工 assignment 3 —— 求最大子数列之和

    版权声明:本文为博主原创文章,未经博主允许不得转载。 http://www.cnblogs.com/Mr-quin/p/8640753.html

    题目要求

    最大连续子数组和(最大子段和)

    问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
    例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
    -- 引用自《百度百科

    代码

    代码
    代码路径
    主程序代码: MaxArray/app/src/main/java/com/aierdeliqi/junittestexample/
    单元测试代码: MaxArray/app/src/test/java/com/aierdeliqi/junittestexample/
    关键代码:

    for(int i = 0; i < array.length ; i++){
        accumulation += array[i];
        max = Math.max(max,accumulation - negativePointer);
        //指针移进
        negativePointer = Math.min(negativePointer,accumulation);
       }
       if(max >= 0){
          return max;
       }else {
          return 0;
    

    思路导图

    每个三角内为累加值,记录曾经遇到过的最小的负数(负值累加的最小值),会发现当累加值减去最小负值时,得到的便是当前的最大子数组之和。

    覆盖标准测试

    参考语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖的示例




    选择覆盖标准

    选用条件组合覆盖

    程序流程图

    判定结构图

    判定语句代码

    1.max = Math.max(max,accumulation - negativePointer);
    2.negativePointer = Math.min(negativePointer,accumulation);

    条件组合覆盖

    序号 条件 用例 期待值
    1 M < A-NP&&NP < A 1,2,3,4 10
    2 M < A-NP&&NP >= A -4,1,2,3 6
    3 M >= A-NP&&NP < A 0,0,0,1 1
    4 M >= A-NP&&NP >= A -1,-2,-3,-4 0

    自动单元测试

    1. 使用默认数据

    数据:-2,11,-4,13,-5,-2
    期待值:20

    程序无错。

    1. M < A-NP&&NP < A

    数据:1,2,3,4
    期待值:10

    此项数据测试的是在某一项出现比0大的累加值且不出现比0小的负累加值时的输出。

    1. M < A-NP&&NP >= A

    数据:-4,1,2,3
    期待值:6

    证明程序无错。
    此项数据测试的是在某一项出现比0大的累加值时且出现比0小的最小累加值时的输出。

    1. M >= A-NP&&NP < A

    数据:0,0,0,1
    期待值:1

    程序无错
    此项数据测试在不出现比max=0还大的累加值又不出现比0小的负累加值时的输出。

    1. M >= A-NP&&NP >= A

    数据:-1,-2,-3,-4
    期待值:0

    程序无错。
    此项数据测试在不出现比max=0还大的累加值且出现比0小的负累加值时的输出。

    试用PSP2.1

    总结

    这次依旧是对Junit的试用与熟悉,与上次作业时相比,这次尝试用了条件组合覆盖的标准,在设计测试数据的时候力争将各种可能的条件组合都覆盖,这是以往编程都不曾用过的全新的测试方法。虽然在AS上,Junit的测试还存在很多局限性,如一些控件和功能无法用数值的方法进行测试。但今后我会继续学习测试方法,优化代码,以求提高编程效率。

    思路改进

    其实想到了可以用两种或多种(如暴力法,分治法,动态规划等)方法生成测试数据来互相进行单元测试验证结果,由于时间问题暂时搁置,以后有时间会来填这个坑。

  • 相关阅读:
    leetcode 13. Roman to Integer
    python 判断是否为有效域名
    leetcode 169. Majority Element
    leetcode 733. Flood Fill
    最大信息系数——检测变量之间非线性相关性
    leetcode 453. Minimum Moves to Equal Array Elements
    leetcode 492. Construct the Rectangle
    leetcode 598. Range Addition II
    leetcode 349. Intersection of Two Arrays
    leetcode 171. Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/Mr-quin/p/8640753.html
Copyright © 2011-2022 走看看